Чаму я павінен паставіць паспрабаваць/злавіць блок з цыклу?

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/ўлову, а не толькі выключэння. Тым не менш, у мяне ёсць праекты, дзе апрацоўка павінна працягвацца, калі адзін з "слухачоў» кінуць выключэнне. Я здзіўляюся, як перапісванне можна было б зрабіць для гэтага? напрыклад: Еогеасп (вар слухач у слухачоў) {паспрабуйце {выкліку (Y); } Засаўка (выключэнне ERR) {_logger.Warning ( "Кліент ХХ зрабіў бла-бла", ERR); }}
дададзена аўтар jgauffin, крыніца
Добры раствор. Але, як вы кажаце, яна павінна выкарыстоўвацца толькі былі гэта было даказана, неабходна (шляхам супастаўлення ці іншых мер).
дададзена аўтар jgauffin, крыніца
Гэта добры прыклад: звычайна, у гэтай сітуацыі, паспрабаваць накладныя выдаткі блока нікчэмна малая ў параўнанні з часам, выдаткаваным ў спасылацца() . Калі гэта не так, аднак, вы можаце выкарыстоўваць укладзены цыкл, каб не прышчыкнуць выключэння ў кожнай ітэрацыі, што дазволіць павялічыць прадукцыйнасць, калі большасць выклікаў спасылацца() поспеху. Нешта накшталт INT I = 0, даўжыня = listeners.length; у той час як (я .
дададзена аўтар Frédéric Hamidi, крыніца

Выключэнне з'яўляецца дарагім - калі паставіць логіку выключэння ў цыкле, вы рызыкуеце, якія маюць выключэння кідаюць на кожную ітэрацыю цыклу. Гэта можа лёгка выклікаць праблемы з прадукцыйнасцю.

Калі паставіць блок Try/ўлоў па-за цыклу, вам трэба будзе толькі для апрацоўкі аднаго выключэння.

10
дададзена
Я думаю, што цыкл будзе перапынены, калі, вядома, пры ўзнікненні выключэнні. Таму, незалежна ад таго, пакласці TRY/злавіць у пятлю або няма, будзе згенеравана выключэнне толькі адзін раз. Ці з'яўляецца гэта правільна?
дададзена аўтар Domi.Zhang, крыніца
@ Domi.Zhang - Не, калі апрацаваць выключэнне ў вашым злавіць , цыкл адновіцца.
дададзена аўтар Oded, крыніца

А паспрабаваць/злавіць ўнутры цыклу паводзіць сябе па-рознаму ад аднаго знешняга цыклу, калі ён заўсёды rethrows выключэнні.

Таму ваш выбар будзе залежаць ад вашых патрабаванняў: калі вы хочаце, каб працягнуць зацыкленне, а затым злавіць ўнутры цыклу, інакш звонку.

Я думаю, што прычына ў тым, што рэкамендацыі паспрабаваць/злавіць ўнутры цыкла выглядае падазрона, як выкарыстанне выключэнняў для кіравання патокам. Гэта маркіроўкі патэнцыйны «код пах», а не пра тое, жорсткі і хуткі правіла.

Але гэта разумна ігнараваць рэкамендацыі, калі гэта тое, што вашыя патрабаванні дыктуюць. Возьмем просты, але састарэлы прыклад, у свеце без Int32.TryParse (.NET 1.x не так даўно!), Было б разумна мець цыкл, які разбірае спіс радкі ў цэлыя лікі, выкарыстоўваючы Int32.Parse у Try/ўлове ўнутры цыклу.

2
дададзена
Try блокі <я> з'яўляюцца аператары кіравання патокам, няхай гэта будзе людзі, як гэта ці не. Альбо звонку, альбо ўнутры цыклу, блок спроба <я> будзе кантраляваць паток <я>, калі адбываецца выключэнне.
дададзена аўтар ThunderGr, крыніца

З-за патэнцыялу для некалькіх выключэнняў, якія ўзнікаюць у контуры, які выклікае непатрэбныя накладныя выдаткі ў вашым дадатку.

Калі ёсць памылка знойдзены ў там, то апрацоўка па-за контуру мае больш сэнсу.

1
дададзена
Гэта, вядома, выклікае накладныя выдаткі; але, не бачачы кода гэта не ўяўляецца магчымым гаварыць пра тое, патрэбны ці няма накладных выдаткаў.
дададзена аўтар Joe, крыніца