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
就是说如果下面的代码中,MsgResolve函数(一个DLL中导出的)发生异常,虽然在try-catch里面,程序也无法捕获是么?
try
{
int ret = MsgResolve(rawDataBuffer, out realtimeErrorT);
}
catch (Exception ex)
{
Common.Log.WriteLog(ex);
rawDataBuffer = null;
}
#7
无法调试。
1- 程序运行在远程服务器上
2- 崩溃时间不定,有时是一天,有时是几个小时。这没法单步啊
#8
请教一下,如此这般,是不是只能防止程序崩溃,但还无法确定原因?
#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
另外,这段代码编译失败啊,“Error 1 An object, string, or class type expected”
#12
崩溃时间不定,同情
这种问题最麻烦了
#13
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
catch
{
string msg= ex.Message+"["+ ex.InnerException.Message+"]";
MessageBox.Show(msg);
}
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
catch
{
string msg= ex.Message+"["+ ex.InnerException.Message+"]";
MessageBox.Show(msg);
}
#14
肯定是死循环了
#15
如果出现 catch(Exception ex){} 无法捕获而可以由无参的 catch{} 捕获的错误,多半 不是由于 .NET 托管程序的原因引起的。
#16
对不起,catch 后面多写了(),见 10 楼。
#17
托管是无法捕获非托管的异常
#18
呵呵~
#19
up~
#20
加了无参的catch,但是还崩溃
不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行 一段时间。。。。 UI还在更新,数据库也还在写。。
简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。
麻烦各位帮忙分析一下,有哪些可能的原因??
多谢!
不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行 一段时间。。。。 UI还在更新,数据库也还在写。。
简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。
麻烦各位帮忙分析一下,有哪些可能的原因??
多谢!
#21
= =b
原本我跟楼主一样以为这样捕获异常就完善了, 看来还有问题...
多谢该帖~
原本我跟楼主一样以为这样捕获异常就完善了, 看来还有问题...
多谢该帖~
#22
catch (InvalidOperationException ex)
{
string msg = ex.Message + "[" + ex.Message + "]";
MessageBox.Show(msg);
}
{
string msg = ex.Message + "[" + ex.Message + "]";
MessageBox.Show(msg);
}
#23
可以先看服务器日志,出错应该会有记录的.
#24
99%的情况是捕获不到dll的错误的,那是非托管的;
#25
99%的情况是捕获不到dll的错误的,那是非托管的;
#26
我始终认为 你某个地方在死循环...
#27
再开一个Vs, tools->attach process,选择所有exception抛出,可以捕获到所有的call stack ,你试试看
#28
同关心, 试着写了个测试程序, 发现问题
Main() 中的 try catch 无法捕捉 form 中新开线程 throw 的异常
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.非托管资源造成的异常
1.线程使用不当的异常
2.非托管资源造成的异常
#32
结合上面的测试例子, 我想了下, Main() 中 try catch 保护的是主 UI 线程的异常安全, 但是另起的线程不归他管, 所以你的程序还是崩溃可以理解, 就要看 socket 所在线程的异常保护处理的如何了
#33
同意 楼上意见:是新开线程异常,可能是资源异常。
#34
这样做是错误的,因为线程执行的异常不会被catch到,除非线程调用的方法中写try catch
需要做一些异步工作而不阻塞UI的任务,推荐使用BackgroundWorker
#35
他异常也不是这里异常,当然无法报错了,你进到你程序中可能出现的异常里面捕获,提示:看是否数据库使用后没有关闭?用的是否是SQLHELPER类? 时间不确定肯定是由于某种属于时间连接出现的问题引起的,建议进程序里面捕获
#36
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……众多语言)此群需要您来共同进步,学习中放松心情。管理员在次致敬,呵呵,搞的不好了。
群号:62464919,本群是IT技术群,包括(C#,Java,ruby,JavaScript,asp,jsp,python,asp.net,sql,mysql……众多语言)此群需要您来共同进步,学习中放松心情。管理员在次致敬,呵呵,搞的不好了。
#40
调试一下,看到哪步出错
#41
厉害
#42
非托管
.
.
#43
调试一下,看走到哪步出错
#44
学习中,关注
#45
看看都调用到那些代码。
#46
有些异常是.net环境无法捕捉到的,具体的那些异常无法捕捉到不记得了,楼主可以上网搜索下.
#47
#48
mark
#49
帮顶
#50
要捕获的异常,这个最好。
#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
就是说如果下面的代码中,MsgResolve函数(一个DLL中导出的)发生异常,虽然在try-catch里面,程序也无法捕获是么?
try
{
int ret = MsgResolve(rawDataBuffer, out realtimeErrorT);
}
catch (Exception ex)
{
Common.Log.WriteLog(ex);
rawDataBuffer = null;
}
#7
无法调试。
1- 程序运行在远程服务器上
2- 崩溃时间不定,有时是一天,有时是几个小时。这没法单步啊
#8
请教一下,如此这般,是不是只能防止程序崩溃,但还无法确定原因?
#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
另外,这段代码编译失败啊,“Error 1 An object, string, or class type expected”
#12
崩溃时间不定,同情
这种问题最麻烦了
#13
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
catch
{
string msg= ex.Message+"["+ ex.InnerException.Message+"]";
MessageBox.Show(msg);
}
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
catch
{
string msg= ex.Message+"["+ ex.InnerException.Message+"]";
MessageBox.Show(msg);
}
#14
肯定是死循环了
#15
如果出现 catch(Exception ex){} 无法捕获而可以由无参的 catch{} 捕获的错误,多半 不是由于 .NET 托管程序的原因引起的。
#16
对不起,catch 后面多写了(),见 10 楼。
#17
托管是无法捕获非托管的异常
#18
呵呵~
#19
up~
#20
加了无参的catch,但是还崩溃
不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行 一段时间。。。。 UI还在更新,数据库也还在写。。
简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。
麻烦各位帮忙分析一下,有哪些可能的原因??
多谢!
不过比较奇怪的是,弹出崩溃的对话框后,程序还能运行 一段时间。。。。 UI还在更新,数据库也还在写。。
简单说,我这程序是socket异步接收后,触发一个事件,在事件处理函数中调用一个DLL函数解析这条消息,之后再从线程池中取一个线程将解析后的消息插入数据库。
麻烦各位帮忙分析一下,有哪些可能的原因??
多谢!
#21
= =b
原本我跟楼主一样以为这样捕获异常就完善了, 看来还有问题...
多谢该帖~
原本我跟楼主一样以为这样捕获异常就完善了, 看来还有问题...
多谢该帖~
#22
catch (InvalidOperationException ex)
{
string msg = ex.Message + "[" + ex.Message + "]";
MessageBox.Show(msg);
}
{
string msg = ex.Message + "[" + ex.Message + "]";
MessageBox.Show(msg);
}
#23
可以先看服务器日志,出错应该会有记录的.
#24
99%的情况是捕获不到dll的错误的,那是非托管的;
#25
99%的情况是捕获不到dll的错误的,那是非托管的;
#26
我始终认为 你某个地方在死循环...
#27
再开一个Vs, tools->attach process,选择所有exception抛出,可以捕获到所有的call stack ,你试试看
#28
同关心, 试着写了个测试程序, 发现问题
Main() 中的 try catch 无法捕捉 form 中新开线程 throw 的异常
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.非托管资源造成的异常
1.线程使用不当的异常
2.非托管资源造成的异常
#32
结合上面的测试例子, 我想了下, Main() 中 try catch 保护的是主 UI 线程的异常安全, 但是另起的线程不归他管, 所以你的程序还是崩溃可以理解, 就要看 socket 所在线程的异常保护处理的如何了
#33
同意 楼上意见:是新开线程异常,可能是资源异常。
#34
这样做是错误的,因为线程执行的异常不会被catch到,除非线程调用的方法中写try catch
需要做一些异步工作而不阻塞UI的任务,推荐使用BackgroundWorker
#35
他异常也不是这里异常,当然无法报错了,你进到你程序中可能出现的异常里面捕获,提示:看是否数据库使用后没有关闭?用的是否是SQLHELPER类? 时间不确定肯定是由于某种属于时间连接出现的问题引起的,建议进程序里面捕获
#36
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……众多语言)此群需要您来共同进步,学习中放松心情。管理员在次致敬,呵呵,搞的不好了。
群号:62464919,本群是IT技术群,包括(C#,Java,ruby,JavaScript,asp,jsp,python,asp.net,sql,mysql……众多语言)此群需要您来共同进步,学习中放松心情。管理员在次致敬,呵呵,搞的不好了。
#40
调试一下,看到哪步出错
#41
厉害
#42
非托管
.
.
#43
调试一下,看走到哪步出错
#44
学习中,关注
#45
看看都调用到那些代码。
#46
有些异常是.net环境无法捕捉到的,具体的那些异常无法捕捉到不记得了,楼主可以上网搜索下.
#47
#48
mark
#49
帮顶
#50
要捕获的异常,这个最好。