2013-09-06 3 views
1

Насколько я знаю, когда возникает случайное исключение, отладчик уведомляется (если есть), а затем, если все еще необработанный, система ищет ближайший обработчик исключений фрейма в стеке, если таковой имеется.Можно ли выполнять обработку векторных строковых исключений в C#?

Я читал this link, когда узнал об управляемой обработке исключений.

Question1) Мне было интересно, если мы можем сделать это в управляемом коде?

Вопрос2) Я думаю, что любой try{}catch{} является обработчиком на основе кадра, но что происходит, когда мы регистрируем ручку на определенные события, как

AppDomain.CurrentDomain.UnhandledException += (x, y) => 
{ 
    Console.WriteLine("Unhandled exception"); 
}; 

Что это?

+0

Событие 'UnhandledException' - это просто нормальное событие. Это связано с обработкой исключений только потому, что .NET вызывает это событие, когда возникает необработанное исключение. –

+0

@JohnSaunders, поэтому вы имеете в виду, что в некотором смысле код, который испускает clr, не делает вызов методу RaiseException, когда что-то не получается внутри блока try? –

+0

Какой код выдает clr? Вы имеете в виду '+ = (x, y) => что угодно? Правильно. Это всего лишь стандартный код обработки событий. Ничего особенного. В .NET почти ничего особенного нет. –

ответ

0

Отладчик уведомляется об исключении только в том случае, если он подключен. Например, если вы выполняете отладку в Visal Studio, то она будет вызываться первым, и если она будет передана в исключение, будут вызваны обработчики исключений. Чтобы отключить отладчик во всех исключениях, из Visual Studio выберите меню «Отладка» и выберите «Исключения», а затем выберите исключения, в которых вы хотите, чтобы отладчик остановился. Если ни один из этих обработчиков (или нет обработчиков), отладчик будет вызван в 2-й раз, чтобы остановить выполнение, и отобразит общее сообщение о том, что произошло исключение. Если, с другой стороны, отладчик не подключен, отладчик не будет уведомлен, что соответствует 99% + всего управляемого производственного кода.

Векторная обработка исключений - это api низкого уровня, предназначенная для использования из неуправляемого кода - то есть C++. Ваш первый выбор из управляемого кода (C#) должен заключаться в использовании структурированной обработки исключений с блоками try/catch/finally. Большинство (99% +) разработчиков кода, использующих язык C#, включая меня, обнаружили, что обработка структурированных исключений вполне адекватна.

Если вы все еще думаете, что вам нужно использовать этот api, вам придется вызвать AddVectoredExceptionHandler, используя P/Invoke, который может быть вызван одним способом неуправляемым кодом из управляемого кода. Есть пара предостережений. См. Эту ссылку для общего overview. Mike Stall's blog предлагает избегать векторных исключений в управляемом коде. В this thread Майк Столл говорит, что неуправляемые обработчики исключений векторных данных никогда не должны переходить в управляемый код. Он также предлагает, что управляемые исключения являются недокументированной функцией в обработке векторных исключений и что MS может устранить эту поддержку в будущей версии CLR, поэтому используйте свою собственную угрозу.

AppDomain.UnhandledException event вызывается только в том случае, если другой обработчик не найден. Его можно использовать в ситуациях, когда требуется зарегистрировать некоторую информацию об необработанном исключении, но мало времени для правильной структурированной обработки исключений для большой базы существующего кода или, возможно, у вас нет доступа к коду что бросает исключение. В противном случае вместо этого следует использовать блоки try/catch/finally.

Вы также можете попробовать взглянуть на AppDomain.FirstChanceException event, который встречается до вызова первого обработчика исключений. Это может быть полезно, если все, что вы хотите сделать, - это зарегистрировать некоторую информацию для определенных исключений, брошенных в чужой код, к которому у вас нет доступа. Это только уведомление, но не обработчик исключений. Я никогда не использовал его раньше, поэтому не знаю, насколько это может повлиять на производительность. Меня беспокоит то, что разработчики Microsoft иногда бросают исключения в CLR для разных вещей, кроме истинных ошибок. Чтобы увидеть это в действии, попробуйте отключить отладчик для каждого исключения, включая исключения среды CLR Runtime. Это можно сделать в Visual Studio из меню Debug и выбрать Exceptions.Таким образом, я не знаю, какое влияние это окажет на производительность, поскольку все исключения CLR, вероятно, также поднимут это событие. Справедливости ради следует отметить, что последний раз я делал это с VS 2008. Это может быть неверно или верно для более поздних версий CLR. Я не вижу способа ограничить исключения, которые это событие будет срабатывать. Таким образом, вам нужно будет отфильтровать те исключения, которые вам не интересны, и экспериментировать, чтобы определить его влияние на производительность.

Смежные вопросы