Где лучше всего ловятся исключения? - PullRequest
1 голос
/ 22 марта 2011

В приложении Winforms C # кажется хорошей идеей отлавливать исключения в методах событий GUI, таких как нажатия кнопок, поскольку именно здесь начинаются все действия пользователя в приложении.

Если я добавлю try-catch-finally предложения в методы событий, то, конечно, все мои исключения могут быть перехвачены и обработаны соответствующим образом?

правый

Ответы [ 8 ]

1 голос
/ 22 марта 2011

В общем, вы должны ловить только те исключения, которые вы знаете, как на самом деле обрабатывать.Вы должны поймать их как можно ближе к месту их возникновения (потому что в этот момент вы знаете, что на самом деле означает исключение).

Если вы ловите исключения только для того, чтобы зарегистрировать их (и если этоWinForms), тогда я бы использовал событие Application.ThreadException.

0 голосов
/ 22 марта 2011

Не забыть AppDomain.UnhandledException. Я всегда обращаюсь и с этим, когда выполняю центральную обработку исключений.

0 голосов
/ 22 марта 2011

Блок try будет работать с любыми неперехваченными исключениями, которые выдает код в блоке try. Это включает в себя методы, которые вы вызываете, любые методы, которые эти методы вызывают, и так далее. Если исключение выдается из одного из этих методов, оно будет «пузыриться» в программе, прерывая циклы, методы и т. Д., Пока не достигнет последнего (т. Е. Самого глубокого) блока попытки его включения.

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

Итак, чтобы ответить на ваш вопрос, если вы знаете, что какие-либо исключения будут происходить внутри обработчика событий (или в методах, вызываемых из этого обработчика событий), тогда оборачивая все это в блок try-catch-finally, вы поймете любые исключения (при условии нетипизированного вылова).

Является ли это хорошей идеей или нет, это вопрос дизайна. Обычно это не так. Обычно вы хотите, чтобы ваши обработчики ошибок находились достаточно близко к месту возникновения ошибки. Однако, не зная вашей ситуации или вашего кода, трудно дать вам какой-либо совет по деталям дизайна, подобным этому.

0 голосов
/ 22 марта 2011

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

Причина в том, что исключение представляет собой состояние ошибки, из-за которого вызывающий код не знает, как с ним работать (если бы он это сделал, то он бы исправил ошибку).В качестве простого примера, скажем, вы выбросили исключение NullReference.Метание кода не имеет представления, почему нужная ему ссылка равна нулю.Возможно, так и должно быть, но код этого не учитывает.Или, может быть, в вашей логике есть ошибка, которая пропускает ноль вниз.

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

0 голосов
/ 22 марта 2011

Пожалуйста, отметьте http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

public static void Main(string[] args){
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

// Set the unhandled exception mode to force all Windows Forms errors to go through
// our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException +=
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

// Runs the application.
Application.Run(new ErrorHandlerForm());}
0 голосов
/ 22 марта 2011

уловы должны быть расположены как можно ближе к источнику метания.Если нажатие вашей кнопки вызывает ваш бизнес-уровень, который выполняет некоторую обработку файла, бизнес-уровень будет лучше знать, как восстанавливаться после исключения FileNotFoundException, чем ваш обработчик нажатия кнопки.

0 голосов
/ 22 марта 2011

да, вы есть.но Исключение для, Перехватывает специфическое исключение для общего исключения.

[обновлено] Если исключение происходит из другого потока, то оно не будет.Правильно, спасибо "Брайан Расмуссен";)

0 голосов
/ 22 марта 2011

Есть несколько способов сделать это ..

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

Посмотрите на другой посто том, как обрабатывать их через Global Handler:

Где лучше всего ловятся исключения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...