2010-03-16 2 views
2

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

Что-то переживает, хотя обслуживание прекращается при некоторых условиях. Есть ли способ определить, где пробелы в моем покрытии try/catch, кроме как на вид?

+0

Является ли этот родной или управляемый код? C# или C++? –

ответ

1

попробуйте попробовать/поймать main функция и все функции нити. Это должно заполнить пробелы, если код третья сторона не нерестится темы

+0

Я уверен, что у меня есть то, что меня озадачивает. –

+0

Вы уверены, что нитки не созданы? вы хотите сделать это для отладки или планируете использовать этот журнал в производстве? – Andrey

+0

Нитки порождаются, я просто убедился, что в них уловил исключения. Я делаю это для целей отладки. –

4

Вы можете поймать исключения AppDomain уровня, как это:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

void CurrentDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e) 
{ 

    //Object exception = e.ExceptionObject; 
    //Boolean terminating = e.IsTerminating; 
} 

Вы можете проверить это link больше примеров.

+0

особенно, если приложение написано на родном языке C++;) – Andrey

+0

Я пробовал это сделать, но я не думаю, что это стало исключением. Я подписался на событие в первой строке метода OnStart моей службы и в методе обработчика, я сделал вызов для моего метода ведения журнала, например: \t \t \t Utility.LogError (e.ExceptionObject as Exception); Однако моя служба отключилась, но у меня нет журнала. Это также должно исключать исключения из других потоков, верно? –

1

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

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

Еще одна вещь, которую следует помнить в любом случае, состоит в том, что каждый поток имеет свой собственный стек и множество исключений. Если вы пытаетесь попробовать/поймать все исключения, вам нужно поймать каждый поток, который работает от вашего имени. В управляемом коде поток финализатора (поток сборщика мусора, который выполняет «деструкторы» или код финализатора) - это одно место, которое часто пропускается.

Однако, прежде чем я подпрыгнул до любого из них, я искал бы выход из процесса или предложение исключения без исключения.

+0

Извините, я работаю в управляемом коде. C#, чтобы быть конкретным. –

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