प्रश्न: सी # में सादे throw
कथन क्या कभी भी एक नया अपवाद पैदा कर सकता है?सी # कारण अपवादों में (सादा) फेंक स्टेटमेंट कर सकते हैं?
ध्यान दें कि मैं जिज्ञासा से बाहर यह सवाल पूछते, इसलिए नहीं कि मैं किसी भी व्यावहारिक या वास्तविक दुनिया स्थिति है जहाँ यह बहुत फर्क होता है। यह भी ध्यान रखें कि मेरा आंत महसूस और अनुभव मुझे बताता है कि उत्तर "नहीं" है, लेकिन मैं किसी भी तरह से उस उत्तर को सत्यापित करने के लिए देख रहा हूं (अब तक मैंने कोशिश की गई स्रोतों पर और देखें)।
यहाँ मेरे सवाल का वर्णन करने के लिए कुछ नमूना कोड:
try
{
int x = 0, y = 1/x;
}
catch (Exception outerException)
{
try
{
throw;
}
catch (Exception innerException)
{
// Q: Does this Assert ever fail??
System.Diagnostics.Debug.Assert(outerException.Equals(innerException));
}
}
मैं वहाँ किसी भी तरह से है कि अगर सब पर, परिस्थितियों ऐसी है कि Assert
असफल हो जायेगी को बदलने के लिए भीतरी try/catch
ब्लॉक को छुए बिना सोच रहा हूँ।
मैं क्या कोशिश की है या यह जवाब देने की कोशिश करने के लिए देख रहा था:
- पढ़ें MSDN पर throw (C# Reference) पेज - कोई निश्चित जवाब;
- C# Language Specification की जांच की गई 5.3.3.11 - जो शायद इस तरह की जानकारी देखने के लिए गलत जगह है;
- अपवादों के माध्यम से चमक गया कि मैं फेंक कथन पर ट्रिगर करने का प्रयास कर सकता हूं। OutOfMemoryException दिमाग में आता है, लेकिन
throw
के समय ट्रिगर करना मुश्किल है। - जेनरेट कोड की जांच करने के लिए ILDASM खोल दिया। मैं देख सकता हूं कि
throw
एकrethrow
निर्देश में अनुवाद करता है, लेकिन मुझे यह पता लगाने के लिए और कहां खोना है कि यह कथन अपवाद फेंक सकता है या नहीं।
यह वही है ILDASM भीतरी try
बिट के लिए पता चलता है:
.try
{
IL_000d: nop
IL_000e: rethrow
} // end .try
तो, संक्षेप में प्रस्तुत करने के लिए: एक फेंक बयान कभी कारण एक अपवाद ही (एक अपवाद rethrow करते थे) कर सकते हैं?
संतोषजनक लोगों को संतुष्ट करने के अलावा, आप किस समस्या को हल करने की कोशिश कर रहे हैं? – Oded
बस जिज्ञासा मुझे डर है, मेरे पास कोई रोमांचक नहीं है (जहां तक अपवाद भी रोमांचक हो सकता है) इससे संबंधित वास्तविक दुनिया परिदृश्य। – Jeroen
मुझे लगता है कि अगर आपका ढेर दूषित हो तो ऐसा हो सकता है। उस स्थिति में रीथ्रो कैच/आखिरकार/गलती खंड के साथ अगली विधि में स्टैक को खोलने का प्रयास करेगा। यदि यह नहीं हो सकता है तो यह अपवाद का कारण बन जाएगा लेकिन अधिकतर एक्जिक्यूशनइंजिन एक्सेप्शन जो आमतौर पर आपकी प्रक्रिया को तत्काल समाप्त कर देगा। –