2013-12-10 4 views
0

У нас есть решение VS2013 (изначально решение VS2012, но это не имеет значения), который содержит несколько проектов. Некоторые библиотеки классов. Некоторые приложения MVC. Некоторые приложения WinForm. Некоторые программные приложения. Нам нужен класс, который мы можем использовать во всех проектах, чтобы захватить необработанные исключения и записать их в настраиваемую цель (конкретное приложение может решить, хочет ли он подключиться к файлу flatfile, журналу событий или db). Идея состоит в том, что при запуске приложение будет вызывать статический метод или создавать экземпляр объекта, а затем любые необработанные исключения будут только волшебным образом регистрироваться для остальной части приложения.C# необработанные исключения catcher

Я думал, что это будет делать трюк (хотя это первая попытка просто входит в FlatFile):

public class InfLogger 
{ 
    public string LogFile { get; set; } 
    public InfLogger() 
    { 
     System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ThreadExceptionHandler); 
     AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionsHandler); 
     LogFile = "C:\\Infinedi.log"; 
    } 

    public void ThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
    { 
     try 
     { 
      if (File.Exists(LogFile)) 
      { 
       File.AppendAllText(LogFile, e.Exception.Message + "\n"); 
      } 
      else 
      { 
       File.WriteAllText(LogFile, e.Exception.Message + "\n"); 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

    public void UnhandledExceptionsHandler(object sender, UnhandledExceptionEventArgs e) 
    { 
     try 
     { 
      if (File.Exists(LogFile)) 
      { 
       File.AppendAllText(LogFile, (e.ExceptionObject as Exception).Message + "\n"); 
      } 
      else 
      { 
       File.WriteAllText(LogFile, (e.ExceptionObject as Exception).Message + "\n"); 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
} 

}

но не радость.

В приложении MVC, которое я использую, чтобы попробовать его протестировать, я создаю экземпляр объекта InfLogger и затем целенаправленно создаю исключение из массива из диапазона необработанного исключения. Но регистратор не запускает ни один из обработчиков событий. :(

Любое предложение о том, как это сделать?

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

namespace TestApp 
    { 
class Program 
{ 
    static void Main(string[] args) 
    { 
     InfLogger logger = new InfLogger(); 
     int[] a = { 0, 1, 2 }; 
     int y = a[6]; 
    } 
} 
} 

И регистратор делает поймать исключение Но исполнение просто висит на линии:... Int у = [6] Он просто продолжает выполнять эту строку, бросая исключение, снова и снова перехватывая необработанное исключение. Теперь мне нужно знать, как получить выполнение, чтобы фактически пройти мимо строки, которая бросает исключение.

+0

, где вы создаете экземпляр класса, ваш ref, возможно, выпадает из сферы действия и получает gc'd? – Jason

+0

Является ли класс InfoLogger проживающим в той же сборке, что и проект, ссылающийся на него? –

+0

Таким образом, ни одно событие не поднимается. Что происходит, когда вызывается исключение? – groverboy

ответ

0

Я вызываю метод в файле Program.cs, чтобы установить метод исключения без обработки. Вот полное объяснение метода Application.SetUnhandledExceptionMode по адресу MSDN.

// .... 
static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     SetUnhandledExceptionHandler(); 
     // ... 

#region -- SetUnhandledExceptionsHandler() Method -- 
    /// <summary> 
    /// Causes all unhandled exceptions to be handled by the application. 
    /// This will not prevent the application from being forced to close, but 
    /// does give a chance to log the error. 
    /// </summary> 
    public static void SetUnhandledExceptionHandler() 
    { 
     // Add an exception handler for all UI thread exceptions 
     Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 

     // Set the unhandled exception mode to force all Windows Forms errors to 
     // Go through this handler 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

     // Add the event handler for handling non-UI thread exceptions 
     AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    } 
#endregion 
+0

Я не хочу, чтобы каждое приложение, чтобы создать это событие обработчики. Мне нужен один класс, который может использовать каждое приложение. –

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