2017-02-16 12 views
0

Из моего исследования этот вопрос был задан очень часто в первые дни сети точек, но IMHO много ответов было немного смехотворным и " это то, как мы делаем это сейчас. Посмотрим, немного ли выросла сеть.Современный подход к 'по ошибке goto [catch-all] label' in C#

Пример Circa 1992:

Sub Main() 
On Error GoTo ErrHand 
....Code Here 
End Sub 

ErrHand: 
    ' raise error nicely here inc error no, desc, line & character pos 
End Sub 

неуклюжим, как это было, «по ошибке Гото [уловам все] ярлык» подход, доступный для VB6 было использование, которое должно было поймать неожиданные исключения и сообщать о них. Он может сообщать описание ошибки с номером &, с модулем, номером строки и положением символа исключения. Разумные разработчики, конечно, могли бы кодировать ожидаемые исключения и исключения из бизнес-логики. Ошибка на ошибке была очень полезным ответом на отсутствие хрустального шара.

Мои приятели C# говорят мне использовать try-catch, но в то же время они говорят, что народные знания говорят о том, чтобы не прикладывать большой улов к каждому методу, потому что это плохая практика.

Но когда я задаю вопрос о точном источнике народного знания, ответа нет.

Итак, что представляет собой ответ 2016 для C# equiv VB6 'на конструкцию ошибок goto [catch-all] label, и почему я не могу стандартизировать try-catch, обертывая содержимое каждого модуля на эффект такой же непредвиденной обработки исключений?

+1

Считается, что это плохо, чтобы попробовать/поймать все? да, почему, когда это было хорошо до этого ... задолго до того, как у нас не было ряда вещей, которые у нас есть сейчас. теперь мы можем протестировать значения NULL и значений в одном ударе с помощью if (stuff? .somethingelse == blah), поэтому он не имеет значения barf для нулей, мы можем проверять числовые преобразования с помощью tryparse, главное правило - это гораздо более локализованные тесты. Код развился, и возврат к vb6 похож на сравнение жизни с 40 лет назад. Так много изменилось, что трудно сравнивать. – BugFinder

+1

try {/ * ... Код здесь * /} catch (Exception ex) {...}. Прямой перевод, не хуже и не лучше, чем подход VB. Как верхний уровень catch-em-all в начальной точке Main(), это не ужасная практика, но вы обычно предпочитаете подписку на событие AppDomain.CurrentDomain.UnhandledException. –

+0

@BugFinder благодарит ваши мысли. Я не ищу здесь ленивого решения - больше пояса и брекетов. Исключения будут происходить. Мы прилагаем все усилия, чтобы справиться с тем, мы ожидаем, что в соответствии с вашими комментариями. Как владелец приложения, я хочу получить самое быстрое исправление, когда мы получаем исключение в реальном времени - это означает, что мне нужна информация.Это означает, что я должен поймать исключение и опросить его, чтобы получить как можно больше подсказок. Отсюда мой вопрос. Я решил упомянуть VB6 как быстрый способ установить контекст. 40-летний разработчик MS-инструментов не обязательно означает, что нам лучше. –

ответ

2

Когда вы не знаете характер ошибки, что вы можете разумно сделать? Почти единственная разумная вещь - попытаться зарегистрировать ошибку, а затем выключиться - вы не можете рассуждать о состоянии программы, все, что вы знаете, это то, что вы так и не подумали.

Таким образом, лучшее место для обработки этой ситуации находится в AppDomain.UnhandledException или аналогичном (обратите внимание, что в документации обсуждаются другие подходы, которые могут применяться для некоторых конкретных моделей приложений).

Таким образом, вы пишете код один раз - не один раз за функция. (Если вы не пишете небольшие «игрушечные» приложения, в наши дни исчезает редкость писать однопоточные приложения, а шаблон On Error Goto должен, по крайней мере, повторяться для каждой функции, которая выступает в качестве точки входа для новой резьба)

в любом другом месте, если вы пишете try/catch, это должно быть, потому что у вас есть конкретной стратегии решения и восстановление из ситуации ошибки.

+0

Thanks - прочитает эту связанную страницу и ответит. Re ', когда вы не знаете ошибки, что разумно делать?' Я согласен, но дело в том, чтобы зафиксировать что-то об исключении, чтобы иметь возможность быстрее диагностировать и решать проблемы. ИМХО как вид, мы должны признать, что будут упущения, которые приводят к необработанным исключениям. В этой дискуссии я менее сосредоточен на причине и многом другом времени. Причины обрабатываются другими усилиями, но моя первая точка стоит - будут исключения, которые не обрабатываются, и я хочу как-то заманить их в ловушку. Это то, что разрешено «по ошибке». –