2015-06-02 4 views
0

Я пытаюсь найти способ сделать все исключения в консольном приложении пройти через IErrorHandler (я использую это обозначение, потому что в wcf этот вид операции возможен с IErrorHandler).Windows Console Application Global IErrorHandler

Я искал в google, но все результаты, похоже, возвращают только решения WCF.

Что я ищу - это решение, немного похожее на this, но для консольного приложения в WCF это выглядит просто, потому что вы можете настроить поведение для каждой конечной точки, но в приложении Windows я считаю, что такое решение также может достижимо.

Все исключения кэшированы, но это устаревший код и вызов метода обработки исключения в каждом catch не является решением для моей проблемы.

Заранее спасибо.

+1

Когда его для консольного приложения, почему вы упоминая ASP.Net? – user2900970

+0

Вы даже попробовали googling для C# Console App Global Exception Handler? Я сделал это, и это был первый результат: http://stackoverflow.com/questions/3133199/net-global-exception-handler-in-console-application – thorkia

+0

В .NET нет такой черной магии вуду. Вы можете получать уведомление только через AppDomain.UnhandledException, но вы не можете справиться с этим исключением, ваша программа всегда завершается. –

ответ

1

Вы можете либо затухать все свои исключения до корня своего консольного приложения, либо обернуть большой try/catch, который обрабатывает все исключения, или в начале вашего консольного приложения вы можете добавить обработчик событий в свой домен приложения для события «Необработанное исключение» и все исключения, которые не обрабатываются, будут перенаправлены туда.

using System; 
using System.Security.Permissions; 

public class Example 
{ 
    [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)] 
    public static void Main() 
    { 
     AppDomain currentDomain = AppDomain.CurrentDomain; 
     currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 

     try { 
     throw new Exception("1"); 
     } catch (Exception e) { 
     Console.WriteLine("Catch clause caught : {0} \n", e.Message); 
     } 

     throw new Exception("2"); 
    } 

    static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
    { 
     Exception e = (Exception) args.ExceptionObject; 
     Console.WriteLine("MyHandler caught : " + e.Message); 
     Console.WriteLine("Runtime terminating: {0}", args.IsTerminating); 
    } 
} 

source

Update

Не много больших простых вариантов делать то, что вы пытаетесь сделать. Одна вещь, которую вы можете попробовать, - установить msysgit/cygwin и использовать инструменты unix, чтобы найти все вхождения. Это было бы довольно экспериментально, и вам нужно было бы провести тяжелые испытания.

find <project dir> -type f -exec sed -i '.bak' 's/catch\(Exception ex\)\r\n{/catch\(Exception ex\)\r\n{\r\nModernExceptionHandler.handle(ex);\r\n/g' {} + 

Каких должен рекурсивно ходить ваши каталоги проекта и заменить вхождение -

catch(Exception ex) 
{ 

с

catch(Exception ex) 
{ 
    ModernExceptionHandler.handle(ex); 

файлов, которые получают модифицированные будет иметь резервную копию сохраненную вместе с ними с .bak файлом расширение.

Более подробная информация о find/sed

+0

Спасибо за ответ, но, возможно, я не объяснил правильно, в моем последнем предложении я сказал, что все исключения обрабатываются и unhandle все исключения не являются решением, потому что это устаревший код, а не простое приложение. –

+0

@DiogoCunha - Обновлено с помощью некоторые магии возможны только с установленными инструментами на основе unix. – cchamberlain

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