2012-09-11 10 views
5

मैं mutables चर से बचने की कोशिश कर रहा हूं, लेकिन समस्या यह है कि मुझे एक वैल तक पहुंचने की ज़रूरत है जिसे मुझे कोशिश के अंदर आरंभ करने की आवश्यकता है (यह एक डीबी ऑपरेशन है जो माइग विफल हो जाता है) और मैं में है कि वर की जरूरत है अंत में ब्लॉकस्कैला: मैकबेल से बचने के लिए कैसे करें

मैं कई विकल्पों के साथ करने की कोशिश की: आरंभ बिना

कोशिश ब्लॉक

try { 
    val resultSet = SQL(sql).resultSet 
    return ColumnInfo(resultSet.getMetaData) 
} catch { 
    case e => throw new ColumnInfoException("Error getting metadata") 
} finally { 
    resultSet.close 
} 

error: not found: value resultSet 

कोशिश ब्लॉक के बाहर वैल की घोषणा के अंदर वैल की घोषणा यह

val resultSet: java.sql.ResultSet 
try { 
    resultSet = SQL(sql).resultSet 
    return ColumnInfo(resultSet.getMetaData) 
} catch { 
    case e => throw new ColumnInfoException("Error getting metadata") 
} finally { 
    resultSet.close 
} 

error: only classes can have declared but undefined members 

एक वर, जो

var resultSet: java.sql.ResultSet = null 
try { 
    resultSet = SQL(sql).resultSet 
    return ColumnInfo(resultSet.getMetaData) 
} catch { 
    case e => throw new ColumnInfoException("Error getting metadata") 
} finally { 
    resultSet.close 
} 

और अंत में घोंसले कोशिश कैच ब्लॉक है, जो बल्कि गंदा

try { 
    val resultSet = SQL(sql).resultSet 
    try { 
    return ColumnInfo(resultSet.getMetaData) 
    } catch { 
    case e => throw new ColumnInfoException("Error getting metadata") 
    } finally { 
    resultSet.close 
    } 
} catch { 
    case e => throw new ColumnInfoException("Error opening resultSet") 
} 

लगता है वहाँ कुछ बेहतर दृष्टिकोण मैं से बचने के लिए ले जा सकते हैं है काम करने के लिए लगता है का उपयोग करते हुए वर्र्स और घोंसले का प्रयास कर ब्लॉक का उपयोग कर?

उत्तर

0

पहले कैच ब्लॉक से छुटकारा के साथ इसका इस्तेमाल करने लगता है:

try { 
    val resultSet = SQL(sql).resultSet 
    try { 
    ColumnInfo(resultSet.getMetaData) 
    } finally { 
    resultSet.close 
    } 
} catch { 
    case e => throw new ColumnInfoException("Error opening resultSet") 
} 
+0

नीचे मतदान की व्याख्या करने के लिए देखभाल की एक टुपल का मूल्यांकन कर सकता है? – nilskp

+0

दूसरी पकड़ भी पहली कोशिश से कोई अपवाद पकड़ लेगा, है ना? (ऊपर से, क्योंकि यह मेरे अपने संस्करण में सुधार करता है ...) – opensas

+0

हां, यह परिणाम सेट बंद कर देगा, लेकिन बाहरी प्रयास ब्लॉक को पकड़ने के लिए छोड़ दें। – nilskp

3
import scala.util.control.Exception._ 

allCatch.either(SQL(sql).resultSet).right.flatMap{ resultSet => 
    val ans = allCatch.either(ColumnInfo(resultSet.getMetaData)) 
    resultSet.close 
    ans 
}.fold(e => throw e, identity) 

या आप fold छोड़ सकते हैं और अपवाद (ओं) को Left में पैक किया जा सकता है।

1

स्कैला में, try ब्लॉक an expression है। आपके मामले में यह val दोनों:

val res: (java.sql.ResultSet, ColumnInfo) = try { 
    val rs = SQL(sql).resultSet 
    (rs, ColumnInfo(rs.getMetaData)) 
} catch { 
    case _: Throwable => throw new Exception("Error getting metadata") 
} finally { 
    res._1.close 
} 
val columnInfo = res._2 
संबंधित मुद्दे