欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

winform或wpf中全局异常捕获

程序员文章站 2022-05-04 11:37:42
winform或者wpf项目中难免会遇到忘记捕获的异常的代码块,c#为我们提供了全局捕获异常的机制 winform中在Program.cs中这样写 static class Program { [STAThread] static void Main() { Application.SetUnhan ......

winform或者wpf项目中难免会遇到忘记捕获的异常的代码块,c#为我们提供了全局捕获异常的机制

winform中在program.cs中这样写

   static class program
   {      
[stathread] static void main() {
application.setunhandledexceptionmode(unhandledexceptionmode.catchexception); //ui线程异常 application.threadexception += application_threadexception; //非ui线程异常 appdomain.currentdomain.unhandledexception += currentdomain_unhandledexception;

application.enablevisualstyles(); application.setcompatibletextrenderingdefault(false); application.run(new formmain());
} private static void currentdomain_unhandledexception(object sender, unhandledexceptioneventargs e) { //log.error or messagebox.show } private static void application_threadexception(object sender, system.threading.threadexceptioneventargs e) { //log.error or messagebox.show } }

wpf中在app.xaml.cs这样写

    public partial class app : application
    {
        public app()
        { 
            //ui线程异常
            this.dispatcherunhandledexception += app_dispatcherunhandledexception;
            //非ui线程异常
            appdomain.currentdomain.unhandledexception += currentdomain_unhandledexception;
        }
        private void currentdomain_unhandledexception(object sender, unhandledexceptioneventargs e)
        {
            //log.error or messagebox.show
        }
        private void app_dispatcherunhandledexception(object sender, system.windows.threading.dispatcherunhandledexceptioneventargs e)
        {
            //log.error or messagebox.show
        }
     }

我们可以在异常回调里面弹窗提示或者记录日志

这样写可以捕获大部分异常信息,但是有些应用场景例外

比如我们使用[dllimport("xxx.dll")]调用c\c++写的方法时,无法捕获异常导致程序卡死或者闪退

我们可以尝试用[handleprocesscorruptedstateexceptions]特性

[handleprocesscorruptedstateexceptions]
public void dosomething()
{
      try
      {
          test(1, 2);
      }
      catch(exception ex)
      {
         //log or messagebox.show
      }
}
[dllimport("xxx.dll")]
public static extern int test(int a,int b);