문제

나는 가장 좋은 방법은 뭔지 궁금은"모든 사람이 실패하는 경우 그것을 잡아".

I mean,처리 있어 많은 예외로 가능한 응용 프로그램 하지만 여전히 있을 수밖에 없 버그,그래서 필요가 있는 뭔가 을 잡는 모든 예외 처리 되지 않은 그래서 나는 정보를 수집하고 저장 들에서 데이터베이스나 제출하는 웹 서비스입니다.

는 사용되지 않.CurrentDomain.이 이벤트를 캡처하는 것일까?는 경우에도 다중 스레드 응용 프로그램?

Side note:Windows Vista 노출 native API 함수할 수 있는 모든 응용 프로그램 을 복구하는 자체 충돌이 발생한 후에...을 생각할 수 없는 이름을 지금...지 사용으로 우리의 많은 사용자가 아직도 사용하여 Windows XP.

도움이 되었습니까?

해결책

방금 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();
    }
}

추신 Application.ThreadException (winforms) 또는 DispatcherUnHandleDexception (WPF)을 위해 처리되지 않은 상태를 처리하십시오.

다른 팁

ASP.NET에서는 다음을 사용합니다 Application_Error 기능 Global.asax 파일.

Winforms에서는 다음을 사용합니다 MyApplication_UnhandledException 에서 ApplicationEvents 파일

코드에서 처리되지 않은 예외가 발생하면이 기능을 모두 호출합니다. 예외를 기록하고 이러한 기능에서 사용자에게 좋은 메시지를 제시 할 수 있습니다.

winform 응용 프로그램의 경우 AppDomain.currentDomain.unhandledException에도 사용합니다. application.threadexception 그리고 application.setUnHandleDexceptionMode (w/ undledlexceptionMode.catchException). 이 조합은 모든 것을 잡는 것 같습니다.

기본 스레드에는 다음 옵션이 있습니다.

다른 스레드의 경우 :

  • 보조 스레드는 도대치되지 않은 외상이 없습니다. 사용 Safethread
  • 작업자 스레드 : (타이머, 스레드 풀) 안전 네트가 전혀 없습니다!

이 사건들은 그렇지 않다는 것을 명심하십시오 핸들 예외, 그들은 단지뿐입니다 보고서 신청서에-종종 유용한 일을하기에는 너무 늦었을 때

로깅 예외는 좋지만 응용 프로그램을 모니터링하는 것이 좋습니다 ;-)

경고 : 저는 저자입니다 Safethread 기사.

Winforms의 경우 현재 스레드의 처리되지 않은 예외 이벤트에도 첨부하는 것을 잊지 마십시오 (특히 멀티 스레딩을 사용하는 경우).

모범 사례에 대한 일부 링크 여기 그리고 여기 그리고 여기 (아마도 .NET의 가장 좋은 예외 처리 기사)

멋진 것이 있습니다 엘마 웹 응용 프로그램에서 발생하는 ASP.NET 오류를 기록합니다. 나는 당신이 Winform 앱 솔루션에 대해 묻는 것을 알고 있지만 웹 앱에서 이러한 유형의 물건을 필요로하는 사람에게는 이것이 도움이 될 수 있다고 생각합니다. 우리는 내가 일하는 곳에서 그것을 사용하고 디버깅에 매우 도움이되었습니다 (특히 프로덕션 서버에서!)

다음은 몇 가지 기능이 있습니다 (페이지에서 바로 가져 왔음).

  • 거의 모든 처리되지 않은 예외의 로깅.
  • 리코드 된 예외의 전체 로그를 원격으로 볼 수있는 웹 페이지.
  • 로그인 한 예외의 전체 세부 사항을 원격으로 볼 수있는 웹 페이지.
  • 대부분의 경우 CustomerRors 모드가 꺼져 있어도 ASP.NET이 주어진 예외에 대해 생성 한 원래 노란색 사망 스크린을 검토 할 수 있습니다.
  • 발생시 각 오류에 대한 이메일 알림.
  • 로그에서 마지막 15 개의 오류의 RSS 피드.
  • Memory, Microsoft SQL Server 및 커뮤니티의 기여를 포함하여 로그에 대한 여러 백업 스토리지 구현.

멀티 스레드 앱에서도 해당 핸들러의 대부분의 예외를 모니터링 할 수 있지만 .NET (2.0으로 시작)는 1.1 호환 모드를 활성화하지 않으면 처리되지 않은 예외를 취소 할 수 없습니다. 그런 일이 발생하면 AppDomain은 무슨 일이 있어도 종료됩니다. 당신이 할 수있는 최선의 방법은 다른 appdomain에서 앱을 시작 하여이 예외를 처리하고 앱을 다시 시작하기 위해 새로운 appdomain을 만들 수 있도록하는 것입니다.

나는 코드의 양을 크게 줄이고 줄인 다음 접근법을 사용하고 있습니다 (그러나 더 나은 방법이 있는지 또는 그 함정이 무엇인지 확실하지 않습니다. 그들의 행동을 명확히하기에 충분히;)

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

오류 핸들러 코드는 다음과 같습니다. 명확하게하려면 : OBJUSER- AppUsers를 모델링하는 객체입니다 (도메인 이름, 부서, 지역 등과 같은 정보를 얻을 수 있습니다. 로깅 목적 ILOG LOGGER- 로깅 객체입니다. 로깅 활동 수행 StackTrace ST- 앱에 대한 디버깅 정보를 제공하는 스택 트레이스 객체

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

에 manged GUI 용,기본값으로 예외에서 발생 하는 GUI 스레드에 의해 처리되는 무엇이든 할당된 응용 프로그램입니다.ThreadException.

예외에서 시작되는 다른 스레드에 의해 처리되지는 않.CurrentDomain.이.

당신이 당신의 GUI 를 실외하-비 GUI 람들,그래서 그들에 의해 처리되지는 않.CurrentDomain.이에,당신은 작업을 수행 할 수 있습니다:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

이점을 잡는 GUI 스레드가 예외를 사용하여 ThreadException 은 당신이를 줄 수 있는 옵션을 사용하의 응용 프로그램을 시켜서 계속합니다.이 없는지 확인합니 config 파일을 재정의 기본 동작,호출할 수 있습니다:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

당신은 여전히 취약하는 예외에서 심하게 행동하는 기본 dlls.는 경우 기본 dll 을 설치하면서 자신의 처리기 Win32 를 사용하여 SetUnhandledExceptionFilter,그것은 가정을 저장하는 포인터를 이전의 여과기와 호출됩니다.지 않는 경우에는,당신의 처리기 wont'get 호출됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top