急问:程序崩溃,无法捕捉到异常。

时间:2023-01-07 11:24:23

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



已经这样写了,为什么程序崩溃时还是没有捕捉到异常???

53 个解决方案

#1


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

#2


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

#3


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

#4


调试一下,看走到哪步出错

#5


            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("出错了!!!");
            }

#6


引用 3 楼 lianshaohua 的回复:
如果你调用了C++或其它语言写的dll,如果dll出错,是捕获不到的。。。。。。


就是说如果下面的代码中,MsgResolve函数(一个DLL中导出的)发生异常,虽然在try-catch里面,程序也无法捕获是么?

            try
            {
                int ret = MsgResolve(rawDataBuffer, out realtimeErrorT);
            }
            catch (Exception ex)
            {
                Common.Log.WriteLog(ex);
                rawDataBuffer = null;
            }

#7


引用 4 楼 ncjcz 的回复:
调试一下,看走到哪步出错


无法调试。
1- 程序运行在远程服务器上
2- 崩溃时间不定,有时是一天,有时是几个小时。这没法单步啊

#8


引用 5 楼 *8808 的回复:
C# codetry
            {
                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("出错了!!!");
            }

请教一下,如此这般,是不是只能防止程序崩溃,但还无法确定原因?

#9


同情

#10


更正一下,最后一个 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("出现了前面没有捕获的错误!!!");
            }

#11


引用 8 楼 sademprie 的回复:
引用 5 楼 *8808 的回复:
 C# codetry
             {
                 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("出错了!!!");
             }



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

#12


引用 7 楼 sademprie 的回复:
引用 4 楼 ncjcz 的回复:
调试一下,看走到哪步出错


无法调试。
1- 程序运行在远程服务器上
2- 崩溃时间不定,有时是一天,有时是几个小时。这没法单步啊


崩溃时间不定,同情
这种问题最麻烦了

#13


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

#14


肯定是死循环了

#15


引用 8 楼 sademprie 的回复:
如此这般,是不是只能防止程序崩溃,但还无法确定原因?


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

#16


引用 11 楼 sademprie 的回复:
这段代码编译失败啊,“Error 1 An object, string, or class type expected”


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

#17


托管是无法捕获非托管的异常

#18


引用 17 楼 hdt 的回复:
托管是无法捕获非托管的异常


 呵呵~

#19


引用 2 楼 libinguest 的回复:
在你的frmMain窗体的载入事件中加上try    catch 来捕捉
up~

#20


加了无参的catch,但是还崩溃
不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行 一段时间。。。。 UI还在更新,数据库也还在写。。

简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。

麻烦各位帮忙分析一下,有哪些可能的原因??
多谢!



#21


= =b
原本我跟楼主一样以为这样捕获异常就完善了, 看来还有问题...
多谢该帖~

#22


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

#23


可以先看服务器日志,出错应该会有记录的.

#24


引用 6 楼 sademprie 的回复:
引用 3 楼 lianshaohua 的回复:
如果你调用了C++或其它语言写的dll,如果dll出错,是捕获不到的。。。。。。


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

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

#25


引用 6 楼 sademprie 的回复:
引用 3 楼 lianshaohua 的回复:
如果你调用了C++或其它语言写的dll,如果dll出错,是捕获不到的。。。。。。


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

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

#26


 我始终认为 你某个地方在死循环...

#27


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

#28


同关心, 试着写了个测试程序, 发现问题
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();
    }
}

#29


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

#30


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

#31


2种情况
1.线程使用不当的异常
2.非托管资源造成的异常

#32


引用 20 楼 sademprie 的回复:
加了无参的catch,但是还崩溃
 不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行一段时间。。。。 UI还在更新,数据库也还在写。。

 简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。

 麻烦各位帮忙分析一下,有哪些可能的原因??
 多谢!

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

#33


引用 31 楼 yuxuanji 的回复:
2种情况
1.线程使用不当的异常
2.非托管资源造成的异常

同意 楼上意见:是新开线程异常,可能是资源异常。

#34


引用 30 楼 lethwei 的回复:
我觉得如果要再提高稳定性的话, 必须保证每个新开的线程都在 try catch 的保护中

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

#35


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

#36


引用 34 楼 yuxuanji 的回复:
引用 30 楼 lethwei 的回复:
 我觉得如果要再提高稳定性的话, 必须保证每个新开的线程都在 try catch 的保护中

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

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

#37


mark

#38


.

#39


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

#40


调试一下,看到哪步出错

#41


厉害

#42


非托管
.

#43


调试一下,看走到哪步出错

#44


学习中,关注

#45


看看都调用到那些代码。

#46


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

#47


该回复于2012-04-15 20:55:59被版主删除

#48


mark

#49


帮顶

#50


引用 1 楼 cstod 的回复:
用Application.ThreadException可以捕获到所有未捕获的异常(只在非调试时捕获,调试时不捕获)

要捕获的异常,这个最好。

#1


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

#2


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

#3


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

#4


调试一下,看走到哪步出错

#5


            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("出错了!!!");
            }

#6


引用 3 楼 lianshaohua 的回复:
如果你调用了C++或其它语言写的dll,如果dll出错,是捕获不到的。。。。。。


就是说如果下面的代码中,MsgResolve函数(一个DLL中导出的)发生异常,虽然在try-catch里面,程序也无法捕获是么?

            try
            {
                int ret = MsgResolve(rawDataBuffer, out realtimeErrorT);
            }
            catch (Exception ex)
            {
                Common.Log.WriteLog(ex);
                rawDataBuffer = null;
            }

#7


引用 4 楼 ncjcz 的回复:
调试一下,看走到哪步出错


无法调试。
1- 程序运行在远程服务器上
2- 崩溃时间不定,有时是一天,有时是几个小时。这没法单步啊

#8


引用 5 楼 *8808 的回复:
C# codetry
            {
                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("出错了!!!");
            }

请教一下,如此这般,是不是只能防止程序崩溃,但还无法确定原因?

#9


同情

#10


更正一下,最后一个 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("出现了前面没有捕获的错误!!!");
            }

#11


引用 8 楼 sademprie 的回复:
引用 5 楼 *8808 的回复:
 C# codetry
             {
                 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("出错了!!!");
             }



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

#12


引用 7 楼 sademprie 的回复:
引用 4 楼 ncjcz 的回复:
调试一下,看走到哪步出错


无法调试。
1- 程序运行在远程服务器上
2- 崩溃时间不定,有时是一天,有时是几个小时。这没法单步啊


崩溃时间不定,同情
这种问题最麻烦了

#13


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

#14


肯定是死循环了

#15


引用 8 楼 sademprie 的回复:
如此这般,是不是只能防止程序崩溃,但还无法确定原因?


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

#16


引用 11 楼 sademprie 的回复:
这段代码编译失败啊,“Error 1 An object, string, or class type expected”


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

#17


托管是无法捕获非托管的异常

#18


引用 17 楼 hdt 的回复:
托管是无法捕获非托管的异常


 呵呵~

#19


引用 2 楼 libinguest 的回复:
在你的frmMain窗体的载入事件中加上try    catch 来捕捉
up~

#20


加了无参的catch,但是还崩溃
不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行 一段时间。。。。 UI还在更新,数据库也还在写。。

简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。

麻烦各位帮忙分析一下,有哪些可能的原因??
多谢!



#21


= =b
原本我跟楼主一样以为这样捕获异常就完善了, 看来还有问题...
多谢该帖~

#22


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

#23


可以先看服务器日志,出错应该会有记录的.

#24


引用 6 楼 sademprie 的回复:
引用 3 楼 lianshaohua 的回复:
如果你调用了C++或其它语言写的dll,如果dll出错,是捕获不到的。。。。。。


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

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

#25


引用 6 楼 sademprie 的回复:
引用 3 楼 lianshaohua 的回复:
如果你调用了C++或其它语言写的dll,如果dll出错,是捕获不到的。。。。。。


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

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

#26


 我始终认为 你某个地方在死循环...

#27


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

#28


同关心, 试着写了个测试程序, 发现问题
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();
    }
}

#29


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

#30


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

#31


2种情况
1.线程使用不当的异常
2.非托管资源造成的异常

#32


引用 20 楼 sademprie 的回复:
加了无参的catch,但是还崩溃
 不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行一段时间。。。。 UI还在更新,数据库也还在写。。

 简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。

 麻烦各位帮忙分析一下,有哪些可能的原因??
 多谢!

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

#33


引用 31 楼 yuxuanji 的回复:
2种情况
1.线程使用不当的异常
2.非托管资源造成的异常

同意 楼上意见:是新开线程异常,可能是资源异常。

#34


引用 30 楼 lethwei 的回复:
我觉得如果要再提高稳定性的话, 必须保证每个新开的线程都在 try catch 的保护中

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

#35


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

#36


引用 34 楼 yuxuanji 的回复:
引用 30 楼 lethwei 的回复:
 我觉得如果要再提高稳定性的话, 必须保证每个新开的线程都在 try catch 的保护中

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

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

#37


mark

#38


.

#39


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

#40


调试一下,看到哪步出错

#41


厉害

#42


非托管
.

#43


调试一下,看走到哪步出错

#44


学习中,关注

#45


看看都调用到那些代码。

#46


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

#47


该回复于2012-04-15 20:55:59被版主删除

#48


mark

#49


帮顶

#50


引用 1 楼 cstod 的回复:
用Application.ThreadException可以捕获到所有未捕获的异常(只在非调试时捕获,调试时不捕获)

要捕获的异常,这个最好。