Nega blokni blokdan chiqarishni sinab ko'rishim kerak?

Here is CodeReview Guideline by Practice&Patterns team.http://msdn.microsoft.com/zh-cn/library/ms998574#scalenetchapt13_topic7(The link navigate to the Exception section automaticly.)

Siz istisno qilganda loopdan blokni sinab ko'rish/to'xtatish kerakligini aytdi, nima uchun buning sababini bilmoqchiman?

11

4 javoblar

Ushalar ... catch blokini asosiy amalga oshirilishi, ishlab chiqarilgan kodga qo'shimcha xarajatlar qo'shib qo'yadi va bu yuklarni torli pastadir sifatida qo'yish yaxshi fikr emas.

Texnik jihatdan, sizning loopingiz barcha iteratsiyalari "teng" bo'lsa va loop istisno yuzaga kelguncha to'xtatilishi kerak bo'lsa, unda loopdan tashqari try ... catch blokini qo'yish yaxshi bo'ladi. Agar istisno holatlarga qaramasdan loop davom etsa, blokni ichki qismga qo'yishga majbur bo'lasiz, ammo siz bu holda dizayningizni ko'rib chiqishingiz mumkin.

16
qo'shib qo'ydi
+1 Faqat "to'g'ri" javob, faqat istisnolar uchun emas, balki sinash/ta'qib qilish blokiga tegishlidir. Biroq, "tinglovchilar" dan biri istisno qilsa, qayta ishlashni davom ettirishi kerak bo'lgan dizaynlar bor. Buning uchun qanday qilib qayta yozish mumkin? masalan: foreach (tinglovchilarda var tinglovchi) {try {invoke (Y); } catch (Exception err) {_logger.Warning ("mijoz X XX bla bla", err); }}
qo'shib qo'ydi muallif jgauffin, manba
Yaxshi echim. Lekin siz aytganingizdek, u faqat kerakli bo'lgan (benchmarking yoki boshqa chora-tadbirlar bilan) tasdiqlangan bo'lsa ishlatilishi kerak.
qo'shib qo'ydi muallif jgauffin, manba
Buning yaxshi namunasi: odatda, bu holatda try blokining yuki invoke() da o'tkaziladigan vaqtga nisbatan ahamiyatsiz bo'ladi. Agar shunday bo'lmasa, har bir iteratsiyada istisnolardan qochish uchun ichki kodni ishlatishingiz mumkin, bu esa agar chaqiradigan() chaqiruvlarning ko'pchiligi muvaffaqiyatli bajarilsa ish faoliyatini oshiradi. int i = 0 kabi bir narsa, len = listeners.length; (i .
qo'shib qo'ydi muallif Frédéric Hamidi, manba

Istisnolar qimmat - agar siz istisno qilish mantig'ini loop ichida joylashtirsangiz, loopning har bir iteratsiyasi uchun istisnolardan foydalanish xavfi tug'iladi. Bu oson ishlash muammolariga olib kelishi mumkin.

Agar siz try/catch bloklarini loopdan tashqariga qo'yadigan bo'lsangiz, faqat bitta istisnoga ega bo'lishingiz kerak.

10
qo'shib qo'ydi
O'ylaymanki, istisno tashlansa, loop albatta o'chiriladi. Shuning uchun, sinchkovlik bilan harakat qilib ko'ring/tutishdan qat'i nazar, istisno faqat bir marta tashlanadi. Bu to'g'rimi?
qo'shib qo'ydi muallif Domi.Zhang, manba
@ Domi.Zhang - Yo'q, catch holatida istisno qilsangiz, loop davom etadi.
qo'shib qo'ydi muallif Oded, manba

Agar loop ichidagi try/catch har doim istisnoni qaytarsa, loopdan tashqaridagi biridan farq qiladi.

Shuning uchun sizning tanlovingiz o'zingizning talablaringizga bog'liq bo'ladi: agar looplashni davom ettirmoqchi bo'lsangiz, unda ko'chadan o'ynang, aks holda tashqarida.

Tavsiyaning sababi, loopning ichida try/catch shubhali boshqaruv oqimi uchun istisnolardan foydalanish kabi ko'rinadi. Bu qattiq va tezkor qoidani emas, balki potentsial "kod hidini" belgilaydi.

Ammo, agar sizning talablaringiz diktsiz bo'lsa, taklifni e'tiborsiz qoldirish oqilona. Int32.TryParse (.NET 1.x oldindan emas edi!) Dunyosida sodda, lekin eskirgan misolni olish uchun, ro'yxatni tahlil qiladigan loopni yaratish maqsadga muvofiqdir. kodni Int32.Parse dan foydalanib butun sonlarga o'tkazing.

2
qo'shib qo'ydi
Odamlar yoqadimi yoki yo'qmi deb ish oqim nazorati bayonotlarini sinab ko'ring. Ilovaning tashqarisida yoki ichki qismida agar bo'lsa, agar oqimini tekshiruv bloklari nazorat qilsa, maxsus holat yuzaga keladi.
qo'shib qo'ydi muallif ThunderGr, manba

Ilovada keraksiz xarajatlar kelib chiqadigan loopda paydo bo'ladigan bir nechta istisnolar potensiali tufayli.

Agar u erda xato topilgan bo'lsa, u holda loopning tashqarisida ishlash mantiqiyroq bo'ladi.

1
qo'shib qo'ydi
Bu, albatta, ortiqcha xarajatlarni keltirib chiqaradi; lekin kodni ko'rmasdan, ustun kerak yoki yo'qligini aytish mumkin emas.
qo'shib qo'ydi muallif Joe, manba