2012-07-16 11 views
6

का उपयोग कर मैं वर्तमान में Play 2.0 (स्कैला) के साथ खेल रहा हूं। मुझे यह स्वीकार करना होगा कि यह बहुत मजेदार है। मेरे पास एक प्रश्न है हालांकि डेटाबेस ऑपरेशंस अपवाद से संबंधित है।प्ले में डीबी से संबंधित अपवादों का प्रबंधन कैसे करें! 2.0/स्केल एनार्म

चलो कहते हैं कि मैं एक डोमेन वर्ग के रूप में कार है और है कि मैं क्षेत्र में से एक पर एक अखंडता बाधा है, मान लें कि मॉडल ताकि मैं दो (2) पंक्तियों होने नहीं हो सकता DB में जाने दें एक ही मॉडल का नाम: जब मैं इस फोन, अगर मैं पिछले कोड में की तरह अपवाद नहीं पकड़

def create(car: Car): Option[Long] = { 
    DB.withConnection { implicit connection => 
     try { 
      SQL("insert into cars (name, model) values ({name},{model}").on("name" -> car.name, "model" -> car.model).executeInsert() 
     } catch { 
      case e: Exception => { 
      Logger.debug(e.getMessage()) 
      None 
     } 
    } 
} 

तो:

case class Car(id: Pk[Long], name: String, model: String) 

मैं इस तरह डीबी में एक रिकॉर्ड डालने के लिए कोशिश कर रहा हूँ तरीका मॉडल पहले से ही डेटाबेस में मौजूदा एक मूल्य के होने के साथ मेरी नियंत्रक से, मैं निम्नलिखित अपवाद उत्पन्न किया है:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Enzo' for key 'model' 

वहाँ के बजाय इतना है कि मैं एक ठीक है MySQLIntegrityConstraintViolationException को पकड़ने के लिए अपवाद एक रास्ता है क्या गलत हो सकता है पर अनाज नियंत्रण और फिर मेरे उपयोगकर्ता को एक संक्षिप्त संक्षिप्त फीड-बैक प्रदान करें उदाहरण के लिए (ब्राउज़र में या मोबाइल डिवाइस पर)?

क्या यह डीबी से संबंधित संचालन और अपवादों को संभालने का सबसे अच्छा तरीका है या क्या कोई भी सर्वोत्तम अभ्यास है जो हर कोई उपयोग करता है? पहले से

धन्यवाद,

उत्तर

2

मुझे लगता है कि आप इन पंक्तियों के भीतर कुछ की तरह देख रहे हैं:

import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 

catch { 
    case e:MySQLIntegrityConstraintViolationException => Logger.debug("Whoops") 
    case e:Exception => { 
    Logger.debug(e.getMessage()) 
    None 
    } 
} 

महत्वपूर्ण नोट: सुनिश्चित करें कि आप com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException आयात करते हैं और नहीं com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException बनाते हैं। अधिक सटीक, सुनिश्चित करें कि आपका आयात आपके स्टैक ट्रेस में अपवाद से मेल खाता है।

सर्वोत्तम प्रथाओं के लिए, मुझे नहीं पता क्योंकि मैं इस ढांचे के साथ भी खेल रहा हूं :)।

उपयोगकर्ता को प्रतिक्रिया के लिए ... शायद फ्लैश स्कोप एक-लाइनर को 'अगले पृष्ठ' पर संवाद करने का एक अच्छा तरीका है (उदाहरण के लिए यदि कार सफलतापूर्वक संग्रहीत या नहीं)। देखें: http://www.playframework.org/documentation/2.0/ScalaSessionFlash ('फ्लैश स्कोप' पर स्क्रॉल करें।)

+1

मैं इस तरह MySQLIntegrityConstraintViolationException अपवाद को पकड़ने की कोशिश की, लेकिन यह काम नहीं कर रहा: यहाँ Maven pom.xml में mysql dependancy खंड है। शायद क्योंकि MySQLIntegrityConstraintViolationException एक केस क्लास नहीं है और फिर पैटर्न-मिलान के लिए योग्य नहीं है। – kaffein

+1

@ कैफिन गैर-केस कक्षाओं को ठीक से मिलान किया जा सकता है, आप बस उन्हें रद्द नहीं कर सकते हैं, उदा। आप 'केस NonCaseClass (e) => 'केस नहीं कर सकते हैं, क्योंकि उनके पास डिफ़ॉल्ट रूप से एक अनुपयोगी विधि नहीं है। मेरे मामले में समस्या गलत आयात था। मैंने com.mysql.jdbc.exceptions.jdbc4 के बजाय 'com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException' आयात किया। MySQLIntegrityConstraintViolationException' ('jdbc4' पैकेज को नोट करें)। –

1

मैं थोड़ा अलग खेल के मैदान में काम कर रहा हूं लेकिन जहां तक ​​मैं समझता हूं, मैंने वही समस्या हल की। मैं लिफ्टवेब, मेवेन और स्कैला 2.9 के साथ काम कर रहा हूं।

अपवाद को RuntimeException के साथ लपेटा गया है। इसे पकड़ने के लिए मैं रनटाइम अपवाद पकड़ता हूं और इसके कारण की जांच करता हूं। यदि यह एक बाधा उल्लंघन है, तो मैं अपना व्यवसाय करता हूं, अन्यथा मैं अपवाद वापस फेंक देता हूं। निर्माण निम्न त्रुटि के साथ विफल रहता है

import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 
... 
    } catch { 
     case e: RuntimeException => { 
     e.getCause match { 
      case cause: MySQLIntegrityConstraintViolationException => { 
      ... 
      } 
      case _ => throw e 
     } 
     } 
    } 

:: निम्नलिखित कोड देखें

error: object mysql is not a member of package com 

जांच Maven पोम पर mysql पैकेज की परिभाषा। मेरे मामले में इसे रनटाइम स्कोप के रूप में परिभाषित किया गया था। इसे संकलित करने के लिए इसे बदलने से बिल्ड को सफल होने की अनुमति मिली और रनटाइम में यह पकड़ ठीक से काम कर रही है।

<dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.18</version> 
     <scope>runtime</scope> 
    </dependency> 
संबंधित मुद्दे