Неліктен циклды сынап/ұстап тұру керек?

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.)

Олар сізге ерекше жағдайды жасаған кезде циклды сынап көріңіз/ұстаңыз, неге екенін білгім келеді?

11

4 жауаптар

try ... catch блогының негізгі іске асуы генерацияланған кодқа үстеме ақы қосады және оны жоғары тығыздыққа қою жақсы идея емес, өнімділікке негізделген.

Техникалық тұрғыдан, сіздің циклыңыздың барлық итерациялары «тең» болса және цикл айрықша орын алса, тоқтап қалуы тиіс, содан кейін циклдің сыртындағы try ... catch блогын қою жақсы. Егер айрықша жағдайларға қарамастан цикл жалғаса берілсе, блокты цикл ішіне қоюға мәжбүр болады, бірақ бұл жағдайда сіздің дизайныңызды қарап шығу қажет болуы мүмкін.

16
қосылды
+1 Жалғыз «дұрыс» жауап тек қана тырысуларға емес, try/catch блогына қатысты. Алайда менің «тыңдаушыларым» біреуін алып тастаса, өңдеуді жалғастыру керек конструкциялар бар. Мен бұл үшін қайта жазудың қалай жасалатынын сұраймын. мысалы: foreach (тыңдаушыларда бар тыңдаушы) {try {invoke (Y); } catch (Exception err) {_logger.Warning («Client XX did bla bla», err); }}
қосылды автор jgauffin, көзі
Жақсы шешім. Бірақ сіз қалай айтсаңыз, ол тек қажет болған жағдайда (бенчмаркинг немесе басқа шаралар арқылы) қолданылуы керек.
қосылды автор jgauffin, көзі
Бұл жақсы мысал: әдетте, бұл жағдайда try call call ішінде өткізілген уақытпен салыстырғанда шамалы. Егер бұлай болмаса, әрбір иерацияда ерекше жағдайларды болдырмау үшін кірістірілген циклды қолдануға болады, бұл invoke() қоңырауларының көпшілігі сәтті болса, өнімділікті арттырады. int i = 0, len = listeners.length сияқты нәрсе; while (i .
қосылды автор Frédéric Hamidi, көзі

Ерекшеліктер өте қымбат - егер Сіз логикалық ерекшеліктерді циклде қоясаңыз, кез-келген иерарға циклда тастайтын ерекше жағдайлар бар. Бұл өнімділік мәселелерін оңай тудыруы мүмкін.

Сынақ/аулау блогын циклден тыс қойсаңыз, тек бір ғана ерекше жағдайды өңдеуіңіз керек.

10
қосылды
Менің ойымша, бұл цикл үзілуі еді, әрине, алып тастау. Сондықтан, тырнақшаға қою/ұстап қоюға қарамастан, тек қана бір рет тастаңыз. Сол дұрыс па?
қосылды автор Domi.Zhang, көзі
@ Domi.Zhang - Жоқ, сіз catch ішіндегі ерекше жағдайды қарастырсаңыз, цикл жалғасады.
қосылды автор Oded, көзі

Цикл ішінде try/catch қоспағанда, әрқайсысы сыртынан бір-бірінен ерекшеленеді.

Сондықтан сіздің таңдауыңыз сіздің талаптарыңызға байланысты болады: егер циклды жалғастырғыңыз келсе, онда шегінен тыс ұстаңыз, әйтпесе сыртында.

Ұсынымның себебі, цикл ішіндегі try/catch басқару ағыны үшін ерекше жағдайларды пайдалану сияқты күдікті көрінеді. Бұл қатаң және жылдам ережені айтқаннан гөрі әлеуетті «код иісін» белгілейді.

Бірақ сіздің талаптарыңыз болса, бұл ұсынысты елемеуге ақылға қонымды. Int32.TryParse (.NET 1.x бұрыннан келе жатқан емес) әлемінде қарапайым, бірақ ескірген мысалды алу үшін, тізімді цикл ішінде try/catch ішіндегі Int32.Parse арқылы бүтін сандарға жолдар.

2
қосылды
блоктарын ағынды басқаруға арналған мәлімдемелерді қолданып көріңіз, адамдар ұнайтындығын немесе жоқ екенін тексеріңіз. Іштен тыс немесе ішіндегі болса, егер ағыны болса, әрекет блогы ерекше болады.
қосылды автор ThunderGr, көзі

Өтініште қажетсіз үстеме шығындар тудыратын циклда бірнеше ерекшелікке арналған әлеуетке байланысты.

Егер онда қате пайда болса, онда циклдің сыртында өңдеу мағынасын арттырады.

1
қосылды
Бұл, әрине, үстеме шығады; бірақ кодты көрмей, үстеме қажет немесе жоқ екенін айту мүмкін емес.
қосылды автор Joe, көзі