.NET - Что лучший способ состоит в том, чтобы реализовать “выгоду весь обработчик исключений”

Снимите флажок «Плюрализовать или сгенерировать имена генерируемых объектов» при создании объекта сущности.

enter image description here

75
задан Ray 20 October 2008 в 20:26
поделиться

3 ответа

Я только что поиграл с поведением UnhandledException AppDomain, (это последний этап, на котором регистрируется необработанное исключение)

Да, после обработки обработчиков событий ваше приложение будет остановлено и появится неприятный диалог «... программа перестала работать».

:) Вы по-прежнему можете этого избежать.

Отметьте:

class Program
{
    void Run()
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        Console.WriteLine("Press enter to exit.");

        do
        {
            (new Thread(delegate()
            {
                throw new ArgumentException("ha-ha");
            })).Start();

        } while (Console.ReadLine().Trim().ToLowerInvariant() == "x");


        Console.WriteLine("last good-bye");
    }

    int r = 0;

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Interlocked.Increment(ref r);
        Console.WriteLine("handled. {0}", r);
        Console.WriteLine("Terminating " + e.IsTerminating.ToString());

        Thread.CurrentThread.IsBackground = true;
        Thread.CurrentThread.Name = "Dead thread";            

        while (true)
            Thread.Sleep(TimeSpan.FromHours(1));
        //Process.GetCurrentProcess().Kill();
    }

    static void Main(string[] args)
    {
        Console.WriteLine("...");
        (new Program()).Run();
    }
}

PS Обрабатывайте необработанные исключения для Application.ThreadException (WinForms) или DispatcherUnhandledException (WPF) на более высоком уровне.

33
ответ дан 24 November 2019 в 11:43
поделиться

Я использую следующий подход, который работает и значительно сокращает объем кода (но я не уверен, есть ли лучший способ и каковы его подводные камни. быть. Когда бы вы ни звонили: Я думаю, что вопросы с указанием минусов были бы достаточно вежливыми, чтобы прояснить их действия; )

try 
{
    CallTheCodeThatMightThrowException()
 }
catch (Exception ex)
{
    System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
    Utils.ErrorHandler.Trap ( ref objUser, st, ex );
} //eof catch

А вот код ErrorHandler: Чтобы прояснить: objUser - это объект, моделирующий пользователей приложений (вы можете получить такую ​​информацию, как имя домена, отдел, регион и т. Д., Для целей ведения журнала. Регистратор ILog - это объект регистрации - например, тот, который выполняет действия регистрации. StackTrace st - объект StackTrace, предоставляющий отладочную информацию для вашего приложения.

using System;
using log4net; //or another logging platform

namespace GenApp.Utils
{
  public class ErrorHandler
  {
    public static void Trap ( Bo.User objUser, ILog logger, System.Diagnostics.StackTrace st, Exception ex )
    {
      if (ex is NullReferenceException)
      { 
      //do stuff for this ex type
      } //eof if

      if (ex is System.InvalidOperationException) 
      {
        //do stuff for this ex type
      } //eof if

      if (ex is System.IndexOutOfRangeException) 
      {
        //do stuff for this ex type
      } //eof if

      if (ex is System.Data.SqlClient.SqlException)
      {
        //do stuff for this ex type
      } //eof if

      if (ex is System.FormatException)
      {
        //do stuff for this ex type
      } //eof if

      if (ex is Exception)
      {
        //do stuff for this ex type
      } //eof catch

    } //eof method 

  }//eof class 
} //eof namesp
0
ответ дан 24 November 2019 в 11:43
поделиться

В управляемом приложении с графическим интерфейсом пользователя по умолчанию исключения, возникающие в потоке графического интерфейса пользователя, обрабатываются тем, что назначено для Application.ThreadException.

Обработка исключений, возникающих в других потоках. by AppDomain.CurrentDomain.UnhandledException.

Если вы хотите, чтобы исключения потока вашего графического интерфейса работали так же, как исключения из вашего графического интерфейса, так что они обрабатывались AppDomain.CurrentDomain.UnhandledException, вы можете сделать следующее:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

Преимущество для перехват исключений потока GUI с помощью ThreadException заключается в том, что вы можете дать пользователю возможность разрешить продолжение работы приложения. Чтобы убедиться, что никакие файлы конфигурации не переопределяют поведение по умолчанию, вы можете вызвать:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

Вы по-прежнему уязвимы для исключений из плохо работающих собственных dll. Если собственная dll устанавливает собственный обработчик с помощью Win32 SetUnhandledExceptionFilter, предполагается сохранить указатель на предыдущий фильтр и вызвать его тоже. Если этого не произойдет, ваш обработчик не будет вызван.

0
ответ дан 24 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: