2012-04-11 10 views
7

मुझे लगता है कि आईएमओ, 1-लाइनर होना चाहिए, जो मुझे सरल कोशिश/पकड़ ब्लॉक को दोहराता है।स्कैला ड्रवाईइंग प्रयास/पकड़

उदाहरण के लिए, मान लें कि मुझे यूरी स्ट्रिंग दिनांक को योडिमेड प्रारूप में जोडा-टाइम में परिवर्तित करने की आवश्यकता है। एक मानक ट्राई/कैच के साथ ब्लॉक रूपांतरण विधि लगता है:

def ymd2Date(ymd: Option[String]) = ymd match { 
    case Some(date) => 
    try { Right(ymdFormat.parseDateTime(date)) } 
    catch { case e => 
     log.info(e.getMessage) 
     Left(None) 
    } 
    case None => 
    Left(None) // no uri date param 
} 
val ymdFormat = DateTimeFormat.forPattern("yyyyMMdd") 

वर्क्स काफी अच्छी तरह से, आशय स्पष्ट है, लेकिन जब मैं, सभी गैर महत्वपूर्ण घटनाओं के लिए प्रवेश फिर मैं ट्राई/कैच इस तरह का कर इसे बाहर निकालने का एक तरीका तलाशें। खोज ने मुझे scala.util.control.Exception पर SO post पर ले जाया। सहायक, लेकिन यह अभी भी थोड़ा मुश्किल है/इसे जिस तरह से मैं चाहता हूं उसे काम करना मुश्किल है। सादे अंग्रेजी में मैं बस कहना चाहता हूं, "कुछ-क्रिया-परिणाम-परिणाम लॉग-त्रुटि-प्रकार पकड़ें"।

तो, मैं control.Exception का हिस्सा मैं में दिलचस्पी रखता हूँ के आधार पर यह पता हैक कर लिया (या समझ में उपयोगी होने के लिए):

class Catcher[T](f: => T) { 
    type Logger = (=> Any) => Unit 

    def either[T](logger: => Logger) = { 
    try { Right(f) } 
    catch { case e => 
     logger(e.getMessage) 
     Left(None) 
    } 
    } 
} 
def catching[T](f: => T) = new Catcher(f) 

और फिर कोशिश तो की तरह/कैच के स्थान पर उपयोग करें:

catching(ymdFormat.parseDateTime(date)) either log.info 

, एक संदेश उपसर्ग, आदि विकल्प पर जोड़ सकते हैं, लेकिन ... यह शायद बेहतर होगा control.Exception ऊपर की तरह काम करने के लिए पाने के लिए एक रास्ता खोजने के लिए, के रूप में typesafe चालक दल के लिए जा रहा है कोड की दुनिया को बेहतर बनाने के लिए मैं कभी भी लिखने की कल्पना करूंगा।

क्या कोई जानता है कि नियंत्रण का उपयोग करके इस तरह के वाक्यविन्यास को कैसे बनाया जाए। अपवाद जहां कोई कैच ब्लॉक में उपयोग किए जाने वाले नाम से लॉगर फ़ंक्शन में पास हो सकता है? अगर वहाँ control.Exception के लिए एक "उपयोग के मामलों"

में मज़ा नहीं आएगा, लेकिन मैं महसूस कर रही इस उपयोगिता और अधिक उन्नत स्काला devs

+3

आप 'या तो' का उपयोग क्यों करते हैं? यदि आप 'वाम' में डाल रहे हैं तो 'कोई नहीं' है, तो ऐसा लगता है कि आप 'विकल्प [टी] 'का उपयोग कर सकते हैं। – huynhjl

+0

अच्छा बिंदु, मैं परिणाम को फोल्ड करना चाहता था और या तो एक प्राकृतिक फिट की तरह लग रहा था ... – virtualeyes

+0

जो कहने के लिए है, वर्तमान में कोई विकल्प नहीं है, या कम से कम – virtualeyes

उत्तर

7

यह आप क्या चाहते हैं करना चाहिए:

import scala.util.control.Exception 
def log(logger: => Logger)(e: Throwable) = { 
    logger(e.getMessage) 
    None 
} 
Exception.allCatch withApply log(logger) apply Some(ymdFormat.parseDateTime(date)) 

लेकिन सामान के इस प्रकार बेहतर मेरी राय में, Scalaz Validation द्वारा नियंत्रित किया जाता।

+0

सही, अभी तक स्कालाज़ पंक्ति को नीचे नहीं लेना है, बस स्काला में अपने पैरों को गीला कर रहा हूं। इसके सबसे बुनियादी रूप में प्रमाणीकरण किसी भी तरह दिखता है, लेकिन फिर जल्दी से रैकेट को घुमाता है। यह करने के लिए है ... – virtualeyes

+0

यह बहुत अच्छा है, बीटीडब्ल्यू, ऐसा लगता है कि मैं अपने हैक को स्क्रैप कर सकता हूं और एक दृष्टिकोण ले सकता हूं कि मेरे अलावा कोई अन्य समझ जाएगा ;-) – virtualeyes

+2

@virtualeyes - इसके लायक होने के लिए, आपका "हैक" डैनियल के दृष्टिकोण की तुलना में मेरे लिए बहुत स्पष्ट है (अगर आप इसे 'पकड़ने' नहीं कहते हैं, बल्कि 'tryOrLog' या कुछ ऐसा नहीं है जो सुझाव नहीं देता कि पहला तर्क स्वयं पकड़ा जाएगा) तो स्पष्ट होगा। –

3

एक त्वरित उदाहरण के लिए मिलती है:

import scala.util.control.Exception._ 

def throwingStuff { 
    throw new Exception("Hello World!") 
} 

catching(classOf[Exception]).withApply{err => println(err.toString); None}.apply(Some(throwingStuff)) 

आप कर सकते हैं withApply का उपयोग Catch कक्षा के अनुप्रयोग तर्क को ओवरराइड करने के लिए करें जैसे लॉग पर लिखना।

+0

भाषा में निर्मित नहीं है रिटर्न प्रकार काफी नहीं है इसके साथ काम करो। 'withApply'' थ्रोबल 'को रिटर्न वैल्यू में परिवर्तित करता है, इसलिए आपको कभी भी' वाम 'नहीं मिलेगा, और' राइट 'का प्रकार' कोई भी 'या' AnyRef' होगा। –

+0

हाँ, आपकी टिप्पणी से ठीक पहले एहसास हुआ और संपादित किया गया! हालांकि, कुछ 'का उपयोग करना एक अच्छा विचार है। – Submonoid

+0

प्रकार को संरक्षित करने की आवश्यकता है। यदि मैं विकल्प [टी] जाता हूं तो प्रकार संरक्षित/सुलभ होगा? – virtualeyes