Отлов обработанных исключений - PullRequest
2 голосов
/ 24 ноября 2010

Привет:)
Есть ли способ отловить исключение обработано в глобальном масштабе?Я знаю, что мы можем перехватывать необработанные исключения с помощью «AppDomain.CurrentDomain.UnhandledException» и «Application.ThreadException», но я хотел бы добавить некоторую обработку к уже обнаруженным исключениям (например, запись в журнал и т. Д.)

спасибо

Ответы [ 3 ]

4 голосов
/ 24 ноября 2010

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

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

При этом, если у вас обработано исключение на более низком уровне, единственный способ, которым вы сможете его перехватить на более высоком уровне, это еслиВы rethrow it из блока Catch на нижнем уровне.
Так, например:

try
{
   //your code
}
catch (SomeException e)
{
   //take any relevant handling measures

   //rethrow the exception
   throw; 
}

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

Для получения дополнительной информации о перебрасывании исключений см .:

2 голосов
/ 24 ноября 2010

Вы можете перебросить то же исключение и перехватить его в вызывающем модуле / модуле регистрации, а затем зарегистрировать его. Например:

private void DivideByZero()
{
try
{
    int x = 2/0;
}
cath(Exception ex)
{
    Console.Writeline(ex.ToString());
    throw;
}
}

void Main(string[] a)
{
    try
    {
       DivideByZero();
    }
    catch(Exception x)
    {
        // write logging code here .. 
    }

}
0 голосов
/ 24 ноября 2010

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

Вы должны быть более структурированы в обработке исключений для достижения того же эффекта. Инкапсулируйте фактическую обработку исключений и выполняйте минимальную работу в реальном блоке catch. Либо просто есть метод "HandleException" где-нибудь, что вы также передаете каждое исключение. Вы также можете взглянуть на Блок обработки исключений в библиотеке Enterprise.

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