कैच एसक्यूएलएक्ससेप्टोइन
फिर SQLException.getSQLState()<का उपयोग करें /कोड>
और इसकी तुलना करके देखें कि क्या आप यही चाहते हैं।
catch (SQLException ex) {
final String ss = ex.getSQLState();
//... blah blah ...
}
देखें PostgreSQL त्रुटि कोड SQLState विवरण के लिए। (जबकि अधिकांश राज्य श्रेणियां और कोड डीबी में मानक हैं, सभी डीबी उन्हें उसी तरह लागू नहीं करते हैं और उन्हें एक ही समय में फेंक देते हैं, और अधिकांश डीबी में अतिरिक्त डीबी विशिष्ट होते हैं)।
SQLState के आधार पर अपवाद को पकड़ने का कोई तरीका नहीं है। दुर्भाग्य से, आपको इसे पकड़ना होगा, और यदि यह वह नहीं है जिसे आप लपेटना चाहते हैं और इसे फिर से फेंक दें। (बिना लपेटे बस फिर से न फेंकें, आप मूल स्टैक खो देते हैं)।
JDBC 4 में SQLException
. के उपवर्ग हैं जैसे SQLNonTransientException
जिसे आप पकड़ सकते हैं, लेकिन केवल तभी जब JDBC ड्राइवर उन उपवर्गों को फेंकता है। लिखने के समय PgJDBC उनका समर्थन नहीं करता है, और हमेशा केवल SQLException
फेंकता है , इसलिए यदि आप उन्हें पकड़ने की कोशिश करते हैं तो आप कभी भी कुछ नहीं पकड़ पाएंगे। (पैच का स्वागत है!)।
वास्तविक दुनिया में आप आमतौर पर कई अलग-अलग त्रुटि स्थितियों में रुचि रखते हैं और उनके आधार पर अलग-अलग काम करना चाहते हैं।
कुछ अस्पष्ट रूप से अनुपयोगी, लिखित-में-खिड़की जैसा:
} catch (SQLException ex) {
final String ss = ex.getSQLState();
if (ss.equals("40001") || ss.equals("40P01")) {
/* It is a serialization failure or a deadlock abort. Retry the tx. */
retry_transaction = true;
} else if (ss.startsWith("08") || ss.startsWith("53")) {
/* It is a connection error or resource limit. Reconnect and retry. */
try {
conn.close();
} catch (SQLException ex) {
logger.log("Error closing suspected bad connection after SQLState " + ss, ex);
}
conn = null; /* App knows to reconnect if it sees a null connection */
retry_transaction = true;
} else {
throw new MyAppException(ex);
}
}
... जहां आपका ऐप फिर से कनेक्ट होने के बारे में जानता है यदि यह एक शून्य कनेक्शन देखता है, और लेन-देन का रिकॉर्ड रखता है जिसे उसने अभी-अभी प्रयास किया है ताकि वह इसे तब तक लूप में पुनः प्रयास कर सके जब तक कि यह एक डेडलॉक या सीरियलाइजेशन विफलता हिट न हो जाए।
वास्तव में आप इससे अधिक स्मार्ट होंगे, पुनर्प्रयासों की दर-सीमित जोड़ना, आदि। यह केवल एक सरल उदाहरण है।
अधिक विवरण के लिए, अपवाद को PSQLException<पर डालें। /कोड>
कास्टेबिलिटी के परीक्षण के बाद, या इसे PSQLException
. के रूप में पकड़ें पहली जगह में। इसके बाद विवरण प्राप्त करें:
ex.getServerErrorMessage()
जो आपको एक ServerErrorMessage
देता है।
विस्तृत क्षेत्रों के साथ।