try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new frmMain());
            }
            catch( Exception ex )
            {
                string msg = ex.Message + "[" + ex.InnerException.Message + "]";
                MessageBox.Show(msg);
            }已经这样写了,为什么程序崩溃时还是没有捕捉到异常???

解决方案 »

  1.   

    用Application.ThreadException可以捕获到所有未捕获的异常(只在非调试时捕获,调试时不捕获)
      

  2.   

    在你的frmMain窗体的载入事件中加上try    catch 来捕捉
      

  3.   

    如果你调用了C++或其它语言写的dll,如果dll出错,是捕获不到的
      

  4.   

                try
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new frmMain());
                }
                catch( Exception ex )
                {
                    string msg = ex.Message + "[" + ex.InnerException.Message + "]";
                    MessageBox.Show(msg);
                }
                catch()
                {
                    MessageBox.Show("出错了!!!");
                }
      

  5.   


    就是说如果下面的代码中,MsgResolve函数(一个DLL中导出的)发生异常,虽然在try-catch里面,程序也无法捕获是么?            try
                {
                    int ret = MsgResolve(rawDataBuffer, out realtimeErrorT);
                }
                catch (Exception ex)
                {
                    Common.Log.WriteLog(ex);
                    rawDataBuffer = null;
                }
      

  6.   

    更正一下,最后一个 catch 的后面不要括号:
               try
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new frmMain());
                }
                catch( Exception ex )
                {
                    string msg = ex.Message + "[" + ex.InnerException.Message + "]";
                    MessageBox.Show(msg);
                }
                catch // <----------------------------------- 这里不要括号
                {
                    MessageBox.Show("出现了前面没有捕获的错误!!!");
                }
      

  7.   

    另外,这段代码编译失败啊,“Error 1 An object, string, or class type expected”
      

  8.   

                try 
                { 
                    Application.EnableVisualStyles(); 
                    Application.SetCompatibleTextRenderingDefault(false); 
                    Application.Run(new frmMain()); 
                }
                catch 
                {
                    string msg= ex.Message+"["+ ex.InnerException.Message+"]"; 
                    MessageBox.Show(msg); 
                }
      

  9.   


    如果出现  catch(Exception ex){} 无法捕获而可以由无参的 catch{} 捕获的错误,多半不是由于 .NET 托管程序的原因引起的。
      

  10.   


    对不起,catch 后面多写了(),见 10 楼。
      

  11.   

    加了无参的catch,但是还崩溃
    不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行一段时间。 UI还在更新,数据库也还在写。。简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。麻烦各位帮忙分析一下,有哪些可能的原因??
    多谢!
      

  12.   

     catch (InvalidOperationException ex)
                {
                    string msg = ex.Message + "[" + ex.Message + "]";
                    MessageBox.Show(msg);
                }
      

  13.   

    99%的情况是捕获不到dll的错误的,那是非托管的;
      

  14.   

    99%的情况是捕获不到dll的错误的,那是非托管的;
      

  15.   

    再开一个Vs, tools->attach process,选择所有exception抛出,可以捕获到所有的call stack ,你试试看
      

  16.   

    同关心, 试着写了个测试程序, 发现问题
    Main() 中的 try catch 无法捕捉 form 中新开线程 throw 的异常static void Main()
    {
        try {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
        catch (Exception ex) {
            MessageBox.Show(ex.Message);
        }
        catch {
            MessageBox.Show("程序捕捉到未知错误");
        }
    }public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }    private void button1_Click(object sender, EventArgs e)
        {
            (new Thread(delegate()
                        {
                        throw new Exception();
                        })).Start();
        }
    }
      

  17.   

    你这种恐怕靠进程本身抓不住了,要另外再开一个进程track这个进程,新版vs有这个功能的,只要有相应的dll,dbg文件就行,有比较多的地方需要设置,一个是exception,如果有非托管的代码,非托管的exception要选上,还有就是相关symbol,在toolbox->debug里面设置,你找找,然后主进程crash时监视进程会出exception,选break,打开call stack,就能看问题所在了
      

  18.   

    我觉得如果要再提高稳定性的话, 必须保证每个新开的线程都在 try catch 的保护中
      

  19.   

    结合上面的测试例子, 我想了下, Main() 中 try catch 保护的是主 UI 线程的异常安全, 但是另起的线程不归他管, 所以你的程序还是崩溃可以理解, 就要看 socket 所在线程的异常保护处理的如何了
      

  20.   

    这样做是错误的,因为线程执行的异常不会被catch到,除非线程调用的方法中写try catch
    需要做一些异步工作而不阻塞UI的任务,推荐使用BackgroundWorker
      

  21.   

    他异常也不是这里异常,当然无法报错了,你进到你程序中可能出现的异常里面捕获,提示:看是否数据库使用后没有关闭?用的是否是SQLHELPER类?    时间不确定肯定是由于某种属于时间连接出现的问题引起的,建议进程序里面捕获
      

  22.   

    BackgroundWorker 不熟悉, 我比较喜欢自己主动管理线程, 有一种一切尽在掌握的王道感private void button1_Click(object sender, EventArgs e)
    {
        (new Thread(delegate()
               {
                  try {
                    this.Invoke((Action)delegate { this.Button1.Enable = false; });
                    throw new Exception();
                  }
                  catch {
                  }
               })).Start();
    }
      

  23.   

    先顶一下搂主,这不是什么恶意行为哦 
    群号:62464919,本群是IT技术群,包括(C#,Java,ruby,JavaScript,asp,jsp,python,asp.net,sql,mysql……众多语言)此群需要您来共同进步,学习中放松心情。管理员在次致敬,呵呵,搞的不好了。
      

  24.   

    有些异常是.net环境无法捕捉到的,具体的那些异常无法捕捉到不记得了,楼主可以上网搜索下.
      

  25.   

    如果你用了自定义控件,看一下是不是自定义控件的问题。
    onpaint 这个函数如果出现这个问题。昨天有个类似的问题。程序单步执行没问题。也不会报错。我也在函数中调用非托管代码。
    查了一天时间才发现是这个问题。
    但不知道是什么原因。