DDN 关于 C# throw ex; 与 throw; 的问题
~每天一个历史遗留问题~
熟悉异常的 C++++ coder,都知道
对于 throw ex; 与 throw; 是有区别的,主要是 CLR 确定异常抛出的起点是有区别的,
如果你不清楚请参考:
《.NET 框架程序设计》Jeffery Richter 李建忠译 chater 18.12 异常堆栈踪迹 P442 的说明
或者见
throw;与throw ex;之间的区别
http://blog.csdn.net/Joy_Zhao/archive/2006/10/27/1352777.aspx
但是,下面的 Button1_Click 即使使用 throw; 也堆栈信息只能跟踪到 Line 14 ,始终无法跟踪到 Line 11,而 Button2_Click 直接到 Line 21
// .aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
try {
object o = null;
int i = (int)o; // Line 11 // Error, System.NullReferenceException
}
catch {
throw; // Line 14
}
}
protected void Button2_Click(object sender, EventArgs e)
{
object o = null;
int i = (int)o; // Line 21 // Error, System.NullReferenceException
}
// .aspx
<asp:Button ID= "Button1 " runat= "server " OnClick= "Button1_Click " Text= "Throw1 " />
<asp:Button ID= "Button2 " runat= "server " OnClick= "Button2_Click " Text= "Throw2 " />
我做过很多测试了,对于用 try-catch-throw 捕获 CLR 运行时内部抛出的异常,即出现这种情况,始终无法跟踪到最原始的内部异常起点
何解 ?也许是我遗漏了某个知识点~
谢谢!
[解决办法]
sf
[解决办法]
winform测试.
单步可以调试到
int i = (int)o; // Line 11 // Error, System.NullReferenceException
[解决办法]
jf
[解决办法]
关注,此点同样疑问
[解决办法]
没有太多的研究,一直认为只要有throw的语名的行,就是有出错信息的行了。
[解决办法]
//这样就能跟踪到你想要的位置(Line11==Line4);
protected void throwErr()
{
object o = null;
int i = (int)o; //Line4 //Error, System.NullReferenceException
}
protected void Button1_Click(object sender, EventArgs e)
{
try
{
throwErr();
}
catch
{
throw;
}
}
protected void Button2_Click(object sender, EventArgs e)
{
object o = null;
int i = (int)o; // Line 12 // Error, System.NullReferenceException
}
[解决办法]
关注,UP
[解决办法]
太高深了,不明白啊
JF
[解决办法]
关注
[解决办法]
这个到的确是奇怪,有没有在catch那里把异常输出看看堆栈是什么?
[解决办法]
测试无法重现问题,.NET Framework 2.0
[解决办法]
关于异常处理。。一直很让我头疼。。
我只知道
try{}catch(){} 是直接把异常抛出。
而
try{}catch(Exception ex){}是要先把异常实例化的,这个过程应该是拿到了很确凿的数据,所以这样是可以追踪到出错的位置的,ex.StackTrace 。
所以如果你想追踪异常的原始位置的话,应该写成后者,但这样效率会有所降低。。
[解决办法]
你这个到底是WinForm的还是控制台的?
不过我用两个都测试过了,没有发现你说的问题。
[解决办法]
难不成见鬼了,你把Console的全部代码贴出来。
是.NET Framework 2.0么,说说你的测试环境……
[解决办法]
SQL Helper很垃圾的,推荐你到我的Blog(http://Ivony.cnblogs.com/)上去看看,尽管不知道谁在那里说垃圾,但我想比SQL Helper还是要强一点点的。
[解决办法]
Study~~
[解决办法]
学习!~~
不过,请教下,
try{}catch(){throw;} 与try{}catch(Exception ex){throw ex;}
只是 你所说得 “前者 IL 指令是 rethrow 后者 IL 指令是 throw”的区别吗??
还有,什么都不写 自动有系统踢出不可继续进行的error 和使用try{}catch(){throw;}
有什么区别呢??
[解决办法]
我用.NET 2.0 能重复出LZ的情况. 这里边的问题实际上是Throw不能百分之百保证原始的Stack Trace.
在网上Google了下,这个问题在MS的下边这个Group里讨论过:
microsoft.public.dotnet.languages.csharp
讨论的题目是:
"Bug?! throw vs. throw ex Options "
里边有各种意见,我比较倾向于这是.NET 的一个Bug. 目前的对策也是和LZ一样,重新包装一下Exception以保证Stack Trace显示正确的行号.