Учитывая ваш пример пользовательского интерфейса -> Method1 -> Method2 -> Method3, я бы удостоверился, что пользовательский интерфейс имеет попытку / перехват, но тогда ни один из других методов не должен перехватывать исключения, если они не могут обрабатывать их безповторно метание.И даже если они обрабатывают исключение, вам следует задать вопрос, должно ли это исключение произойти в первую очередь.Если вы обрабатываете исключение и идете своим путем, то это исключение является частью вашего обычного процесса, который вызывает серьезный запах кода.
Вот мои рекомендации:
1) Поставьтекод обработки исключений во всех ваших событиях пользовательского интерфейса, а затем фактическое действие передается другому методу.Не разбрасывайте код обработки исключений повсюду.Это неуклюже и делает код трудным для чтения.
protected void Button1_Click(object sender, EventArgs e) {
try {
DoSomething();
}
catch Exception e {
HandleError(e);
}
}
2) Не делайте этого.Вы потеряете трассировку стека, и следующий разработчик, поддерживающий ваш код, будет выслеживать вас.
try {
DoSomething();
}
catch Exception e {
throw e; // don't rethrow!!!
}
Если вы не собираетесь обрабатывать исключение, не перехватывайте его .Или используйте голый бросок так:
try {
DoSomething();
}
catch SomeException e {
HandleException(e);
}
catch {
throw ; // keep my stack trace.
}
3) Бросать исключения только в исключительных случаях.Не включайте блоки try / catch как часть вашего обычного потока процессов.
4) Если вы собираетесь генерировать исключение, не ever генерируйте исключение System.Exception.Получите объект исключения и бросьте его.Я часто просто общий BusinessException
класс.Таким образом, пользователи вашего кода могут определить, какие исключения вы создали, а какие связаны с системой / средой.
5) Бросить ArgumentException
, ArgumentNullException
или ArgumentOutOfRangeException
, если вызывающий метод нарушаетконтракт (предварительные условия) вашего метода.Если вы поймаете один из них, это ошибка программирования.Пользователь никогда не должен видеть эти исключения.
Если вы помните, что исключения должны быть очень редким явлением и что обработка их почти всегда связана с пользовательским интерфейсом (поэтому большая часть кода try / catch должна оставаться в пользовательском интерфейсе).уровень) у тебя все получится.