معالجة الاستثناء وتفكيك المكدس في ص
-
12-12-2019 - |
سؤال
من أجل إعداد واجهة معالجة استثناء متماسكة لزملائي والنصوص ص بلدي ، وأود أن توظيف هيكل تريكاتش التالية.
- هو ملفوفة في محاولة الخارجي حول النصي ص معين.يتم استخدامه للقبض والتعامل مع الأخطاء القاتلة التي تتطلب البرنامج النصي لإجهاض.
- أوامر المحاولة الخاصة بالمستخدم داخل البرامج النصية للمستخدم.يجب أن تصطاد هذه وربما تتعامل معها
- 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)
})