C\#프로그램 이상 종료 시 캡 처

본 고 는 C\#Winform 프로그램 이 이상 하 게 닫 혔 을 때 어떻게 캡 처 하고 로 그 를 기록 하 는 지 간단 한 예 로 설명 한다.
개술
때때로 인터페이스의 이벤트 에서 분명히 try..catch 가 캡 처 이상 이 있 지만 이상 하 게 닫 히 는 경우 가 있 기 때문에 프로그램 에서 캡 처 할 수 없 는 이상 을 어떻게 최종 적 으로 기록 하 는 지 문제 의 포 지 셔 닝 분석 과 프로그램 최적화 에 큰 편 의 를 줄 수 있 습 니 다.
지식 에 관련되다
다음 두 가지 이상 사건 은 주로 서로 다른 장면 을 응용 한다.
  • application.ThreadException 은 응용 프로그램 UI 메 인 스 레 드 에서 스 레 드 이상 이 포착 되 지 않 았 을 때 발생 하 는 이벤트 입 니 다
  • AppDomain.CurrentDomain.Unhandled Exception 백 엔 드 라인 에서 이상 이 포착 되 지 않 았 을 때 터치 합 니 다
  • 소스 코드
    주요 프로그램(Program):
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace DemoException
    {
      static class Program
      {
        /// <summary>
        ///          。
        /// </summary>
        [STAThread]
        static void Main()
        {
          Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
          //  UI    
          Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
          //       
          AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException) ;
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
          Application.Run(new FrmMain());
          glExitApp = true;//          
        }
    
        /// <summary>
        ///         
        /// </summary>
        static bool glExitApp = false;
    
        /// <summary>
        ///        
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
    
          SaveLog("-----------------------begin--------------------------");
          SaveLog("CurrentDomain_UnhandledException"+DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
          SaveLog("IsTerminating : " + e.IsTerminating.ToString());
          SaveLog(e.ExceptionObject.ToString());
          SaveLog("-----------------------end----------------------------");
          while (true)
          {//    ,          
            if (glExitApp)
            {//          ,       ,       
              SaveLog("ExitApp");
              return;
            }
            System.Threading.Thread.Sleep(2 * 1000);
          };
        }
    
        /// <summary>
        ///   UI     
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
          SaveLog("-----------------------begin--------------------------");
          SaveLog("Application_ThreadException:" + e.Exception.Message);
          SaveLog(e.Exception.StackTrace);
          SaveLog("-----------------------end----------------------------");
        }
    
        public static void SaveLog(string log)
        {
          string filePath =AppDomain.CurrentDomain.BaseDirectory+ @"\objPerson.txt";
          //  using   ,     
          using (FileStream fs = new FileStream(filePath, FileMode.Append))
          {
            using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
            {
              sw.WriteLine(log);
            }
          }
        }
      }
    }
    잘못된 프로그램:
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace DemoException
    {
      public partial class FrmMain : Form
      {
    
        public FrmMain()
        {
          InitializeComponent();
        }
    
        private void FrmMain_Load(object sender, EventArgs e)
        {
          
        }
    
        private void btnTestUI_Click(object sender, EventArgs e)
        {
          int a = 0;
          int c = 10 / a;
        }
    
        private void btnTest2_Click(object sender, EventArgs e)
        {
          Thread t = new Thread(new ThreadStart(() =>
          {
            int a = 0;
            int c = 10 / a;
          }));
          t.IsBackground = true;
          t.Start();
        }
      }
    }
    
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기