2012-02-28 13 views
11

मैं scalatra उपयोग कर रहा हूँ करने के लिए "निर्यात" JSON करने के लिए एक MongoDB डेटा, अपने कार्यों की तरह, बहुत सरल कर रहे हैं:किसी भी स्केलेट्रा एक्शन में सभी त्रुटियों को कैसे पकड़ें?

get("/") { 
     val title = db.get_collection("main", "api", "title") 
     send_json(title) 
    } 

मैं एक HTTP त्रुटि और संदेश भेजने के लिए अगर कुछ गलत हो जाते हैं, दूसरी तरफ चाहते इसे उपयोगकर्ता के लिए कुछ अर्थ में परिवर्तित कर दिया जाएगा। तो विधि becames:

get("/") { 
    try { 
     val title = db.get_collection("main", "api", "title") 
     send_json(title) 
    } catch { 
     case e:java.util.NoSuchElementException => send_error("DB malformed", InternalError) 
     case e:com.mongodb.MongoException => send_error("Can not connect to MongoDB", InternalError) 
     case e => send_error("Internal Error", InternalError) 
    } 
    } 

कोशिश पकड़ है कि वास्तविक विधि बड़ा है और मैं हर विधि, वर्ग पहली नजर में बनने की कोशिश पकड़ने का एक बदसूरत संग्रह के लिए यह करने के लिए की जरूरत है। बुरी दिखने और विचलित करने से बचने का कोई तरीका है पूरे कोड को पकड़ने का प्रयास करें? मैं स्कैला (और जावा बीटीडब्लू) के लिए नया हूं इसलिए मुझे लगता है कि मुझे कुछ याद आ रहा है।

मैं डीबी ऑब्जेक्ट JSON भेजने के लिए नहीं चाहता, इसलिए db.get_collection विधि पर प्रयास करने का प्रयास एक विकल्प नहीं है।

उत्तर

5

ठीक है, मैं Scalatra पर्याप्त पता नहीं है, लेकिन catch ब्लॉक एक आंशिक समारोह है, तो आप कुछ इस तरह कर सकता है:

val errorHandling: PartialFunction[Throwable, Unit] = { 
    case e:java.util.NoSuchElementException => send_error("DB malformed", InternalError) 
    case e:com.mongodb.MongoException => send_error("Can not connect to MongoDB", InternalError) 
    case e => send_error("Internal Error", InternalError) 
} 

get("/") { 
    try { 
    val title = db.get_collection("main", "api", "title") 
    send_json(title) 
    } catch errorHandling 
} 
+0

मेरा अंतिम समाधान था: 'वैल errorHandling: PartialFunction [फेंकने योग्य, यूनिट] = {' अगर मैं errorHandler उपयोग करते हैं, मैं ओवरराइड करने की आवश्यकता है कि नाम के बारे में त्रुटि मिला है। यह java.lang की भी आवश्यकता है। अपवाद – user1216071

+0

@ user1216071 ठीक है, मैंने कोड को तदनुसार तय किया है, इसलिए दूसरों को इसे समझना नहीं होगा (यदि वे आपकी टिप्पणी को याद करते हैं)। –

37

इस के लिए एक विशेष मार्ग हैंडलर है:

error { 
    case e: Throwable => { 
    redirect("/") 
    } 
} 

case कथन बदलकर आप त्रुटि प्रकार पर स्विच कर सकते हैं।

+0

स्केलत्रा में त्रुटियों को संभालने के लिए यह मूर्खतापूर्ण विधि है, हालांकि यह दस्तावेज़ से अनुपलब्ध है। – afternoon

+3

यह स्वीकार्य उत्तर होना चाहिए। –

संबंधित मुद्दे