سؤال

هل هناك طريقة لاكتشاف، من داخل الجملة الأخيرة، أن الاستثناء قيد الطرح؟

انظر المثال أدناه:


try {
    // code that may or may not throw an exception
} finally {
    SomeCleanupFunctionThatThrows();
    // if currently executing an exception, exit the program,
    // otherwise just let the exception thrown by the function
    // above propagate
}

أم أن تجاهل أحد الاستثناءات هو الشيء الوحيد الذي يمكنك فعله؟

في لغة C++، لا يسمح لك حتى بتجاهل أحد الاستثناءات ويكتفى فقط بإنهاء المكالمات ().تستخدم معظم اللغات الأخرى نفس القواعد التي تستخدمها Java.

هل كانت مفيدة؟

المحلول

قم بتعيين متغير العلم، ثم تحقق منه في الجملة النهائية، كما يلي:

boolean exceptionThrown = true;
try {
   mightThrowAnException();
   exceptionThrown = false;
} finally {
   if (exceptionThrown) {
      // Whatever you want to do
   }
}

نصائح أخرى

إذا وجدت نفسك تفعل ذلك، فقد يكون لديك مشكلة في التصميم الخاص بك.فكرة الكتلة "الأخيرة" هي أنك تريد القيام بشيء ما بغض النظر عن كيفية خروج الطريقة.يبدو لي أنك لا تحتاج إلى كتلة أخيرًا على الإطلاق، ويجب عليك فقط استخدام كتل محاولة الالتقاط:

try {
   doSomethingDangerous(); // can throw exception
   onSuccess();
} catch (Exception ex) {
   onFailure();
}

إذا تم إطلاق دالة وأردت اكتشاف الاستثناء، فسيتعين عليك تغليف الوظيفة في كتلة محاولة، فهذه هي الطريقة الأكثر أمانًا.لذلك في المثال الخاص بك:

try {
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { //or catch whatever you want here
        // exception handling code, or just ignore it
    }
}

هل تقصد أنك تريد أن تعمل الكتلة الأخيرة بشكل مختلف اعتمادًا على ما إذا كانت كتلة المحاولة قد اكتملت بنجاح؟

إذا كان الأمر كذلك، يمكنك دائمًا القيام بشيء مثل:

boolean exceptionThrown = false;
try {
    // ...
} catch(Throwable t) {
    exceptionThrown = true;
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { 
        if(exceptionThrown) ...
    }
}

على الرغم من أن الأمر أصبح معقدًا جدًا ...قد ترغب في التفكير في طريقة لإعادة هيكلة التعليمات البرمجية الخاصة بك لجعل القيام بذلك غير ضروري.

لا لا أعتقد ذلك.سيتم تشغيل كتلة الالتقاط حتى الاكتمال قبل الكتلة النهائية.

try {
    // code that may or may not throw an exception
} catch {
// catch block must exist.
finally {
    SomeCleanupFunctionThatThrows();
// this portion is ran after catch block finishes
}

بخلاف ذلك، يمكنك إضافة كائن syncronize() الذي سيستخدمه رمز الاستثناء، والذي يمكنك التحقق منه في الكتلة الأخيرة، مما سيساعدك على تحديد ما إذا كنت تقوم بتشغيل استثناء في موضوع منفصل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top