Вот как я это делаю для консольных инструментов, работающих на сервере непрерывной интеграции:
private static void Main(string[] args)
{
var parameters = CommandLineUtil.ParseCommandString(args);
#if DEBUG
RunInDebugMode(parameters);
#else
RunInReleaseMode(parameters);
#endif
}
static void RunInDebugMode(IDictionary<string,string> args)
{
var counter = new ExceptionCounters();
SetupDebugParameters(args);
RunContainer(args, counter, ConsoleLog.Instance);
}
static void RunInReleaseMode(IDictionary<string,string> args)
{
var counter = new ExceptionCounters();
try
{
RunContainer(args, counter, NullLog.Instance);
}
catch (Exception ex)
{
var exception = new InvalidOperationException("Unhandled exception", ex);
counter.Add(exception);
Environment.ExitCode = 1;
}
finally
{
SaveExceptionLog(parameters, counter);
}
}
Обычно в режиме выпуска мы перехватываем все необработанные исключения, добавляем их в глобальный счетчик исключений, сохраняем в некоторый файл и затем завершаем работу с кодом ошибки.
В режиме отладки больше исключений попадает прямо в точку выброса, плюс мы по умолчанию используем консольный логгер, чтобы увидеть, что происходит.
PS: ExceptionCounters, ConsoleLog и т. Д. Взяты из общих библиотек Lokad