سؤال

من أجل إعداد واجهة معالجة استثناء متماسكة لزملائي والنصوص ص بلدي ، وأود أن توظيف هيكل تريكاتش التالية.

  1. هو ملفوفة في محاولة الخارجي حول النصي ص معين.يتم استخدامه للقبض والتعامل مع الأخطاء القاتلة التي تتطلب البرنامج النصي لإجهاض.
  2. أوامر المحاولة الخاصة بالمستخدم داخل البرامج النصية للمستخدم.يجب أن تصطاد هذه وربما تتعامل معها
    • 2أ.أخطاء غير قاتلة ، حيث لا يلزم الإجهاض النصي
    • 2ب.قاتلة-الأخطاء التي تتطلب البرنامج النصي لإجهاض.يتم التعامل مع الخطأ عن طريق المحاولة الخارجية [انظر 1.]
    • 2ج.قاتلة-أخطاء مع معلومات خطأ إضافية.خطأ التعامل معها من قبل تريكاتش الخارجي.

الكود التالي هو كيف يمكنني تنفيذ هذه الميزات.ومع ذلك ، بما أنني لست خبيرا في ص ، أود أن أسأل ما إذا كان هذا هو نهج جيد.على وجه التحديد:

س1.هل من المقبول عدم تحديد معالج خطأ في المحاولة الداخلية وانتظار المحاولة الخارجية للتعامل مع هذا الخطأ (انظر 2 ب.أعلاه والرمز أدناه)?

س2.هو إعادة طرح نفس الخطأ (انظر 2 ج.فوق / أدناه) ضمن معالج الصحيح/يعتبر أسلوب الترميز جيدة?

شكرا لك!

#outer tryCatch, see 1.
tryCatch({
  #user code block
  #2a. user specific tryCatch, object "vec" not defined
  tryCatch(print(vec),error=function(e) {print("Non-fatal error. Script execution continued.");print(e);})

  #2b. user specific tryCatch
  tryCatch(vec*2)

  #2c. user specific tryCatch
  tryCatch(vec*parameter1, error=function(e) {print("Additional fatal error information. Script execution aborted.");stop(e);})
  #end of user code block
},
     #outer tryCatch error handler in order to handle fatal errors
     error=function(e) {print("Fatal error");print(e);} 
    )
هل كانت مفيدة؟

المحلول

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

ourError <-
    function(original, message, class="ourError")
{
    msg <- paste(message, conditionMessage(original), sep="\n  ")
    structure(list(message = msg, call = conditionCall(original)),
              class = c(class, class(original)))
}

ورمي و / أو التعامل مع ذلك

tryCatch(vec*parameter1, error=function(e) {
    err <- ourError(e, "addition fatal info; script aborted")
    stop(err)
})

تتمثل إحدى مزايا ذلك في أنه يمكن تحديد سلوكيات إضافية في معالج المستوى الأعلى ، باستخدام الفئة التي تم إرجاعها بواسطة ourError()

tryCatch({
    tryCatch(stop("oops"), error=function(e) {
        err <- ourError(e, "addition fatal info; script aborted",
                      c("fatal", "ourError"))
        stop(err)
    })
}, ourError=function(err) {
    message("We caught but didn't handle this:\n", err)
}, error =function(err) {
    message("This one got away: ", err)
})
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top