那么,一旦出现异常,就会catch住,但是不会抛到VS中。但是在开发的时候,有没有什么办法让程序在异常处停下来呢?
30 个解决方案
#1
把try catch去掉就能停下来……
#2
在catch中加个messagebox,来弹出错误信息,或在catch中将错误信息写到日志中或文本框中就能知道是什么错误了
#3
或者在for之前设置一些变量来记录一些信息咯
#4
按f5,或者调试-开始调试
在catch处下断点遇到异常就会停下来
在catch处下断点遇到异常就会停下来
#5
catch加断点不就可以了?????
#6
try
{ }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
{ }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
#7
加断点,f10 单步执行
#9
catch加断点
不要用e.message
而直接e.tostring
能看到详细的错误信息
然后再看循环变量是多少,就能知道到底循环到第几次出错
不要用e.message
而直接e.tostring
能看到详细的错误信息
然后再看循环变量是多少,就能知道到底循环到第几次出错
#10
用宏编译。
#if DEBUG
你的code
#else
try{ 你的code} catach....
#endif
#if DEBUG
你的code
#else
try{ 你的code} catach....
#endif
#11
我那会表达的可能不清楚。我的意思是,不知道哪里抛出的异常。在catch处可以停下,并且看到异常信息,但是不知道是哪一行代码抛出来的。我上午找了找,有这样一个解决 办法。但是也有弊端,就是会捕捉到很多不需要的异常。
#12
去掉try catch 开发完毕重构代码的时候再加上try catch我一般我这么开发的
#13
貌似有一个叫做 Exception.StrackMessage
#14
那怎么知道现在这个程序执行到哪里了呢?
#15
你世界把try catch注释掉 然后调试 不就知道哪一步的问题了么。。。
#16
catch(Exception ex){
Console.WriteLine(ex)
}
Console.WriteLine(ex)
}
#17
异常的堆栈跟踪会提示代码出错的位置的, 如果你需要这个确切的信息, 需要自己写(扩展)方法从异常堆栈中取出来.
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等,
这些信息全不都在 Exception 里
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等,
这些信息全不都在 Exception 里
#18
http://msdn.microsoft.com/zh-cn/library/system.exception(VS.80).aspx
#19
能不能写一句代码,谢谢,不太懂。。。
#20
#21
你要的那些信息你可以自己去写相应的log。
还有你要知道,你执行的cs文件实际上是编译好的dll。所以你的异常你是想做什么,这个得想清楚
还有你要知道,你执行的cs文件实际上是编译好的dll。所以你的异常你是想做什么,这个得想清楚
#22
f5
调试
调试
#23
你可以catch(Exception ex){
//这里看是抛异常还是弹出到界面
......
//有异常也继续执行
continue;
}
//这里看是抛异常还是弹出到界面
......
//有异常也继续执行
continue;
}
#24
把光标放到 try 上按F9,然后运行程序就会停到try的地方,然后按F10一步一步走,等出现异常的时候就会跳到catch;
由于你刚才是按F10走到catch的,你当然就知道错在哪了
由于你刚才是按F10走到catch的,你当然就知道错在哪了
#25
那你在循环里面处理 try catch不就行了么;
try { }
catch (Exception ex)
{
contiune;
}
try { }
catch (Exception ex)
{
contiune;
}
#26
1. System.Exception.StackTrace 属性可以标识 发生异常的 应用程序路径和行号。
2. 其实在捕获到了异常就 for 循环就停了下来,然后处理你的catch代码,不建议try...catch一大范围代码,因为try...catch 是要记录追踪的,耗性能,能缩小范围尽量缩小。改到for循环里面似乎更好些.
2. 其实在捕获到了异常就 for 循环就停了下来,然后处理你的catch代码,不建议try...catch一大范围代码,因为try...catch 是要记录追踪的,耗性能,能缩小范围尽量缩小。改到for循环里面似乎更好些.
#27
使用“条件编译”指令,只有在 !DEBUG 时才应该有 try...catch 代码被编译进去。
#28
晕死。不知道编程的目的是开发大系统呢?还是玩儿点几十行的小程序呢?
#29
我们经常很谨慎地说“如果是在DEUG状态下,那么就不要 try...catch”。可能不太聪明的人,容易忘记注意这里的前提条件,而是总想“简单地”纠结于是非结论,从来不注意条件。
debug跟release的目的不同。debug时你当然应该尽可能早地让异常抛出来。这是根本的区别。
有两种主要的写法。一种是比较古老的写法,至少有30年历史,大量程序都是这样写的:
另外一种方法是在c#最近6、7年的高版本中支持的,使用了.net的 ConditionalAttribute 标签来告诉编译器如何进行条件编译。
debug跟release的目的不同。debug时你当然应该尽可能早地让异常抛出来。这是根本的区别。
有两种主要的写法。一种是比较古老的写法,至少有30年历史,大量程序都是这样写的:
public static void Execute(ServerSession session, string ln)
{
Command msg = null;
#if !DEBUG
try
{
#endif
msg = (Command)JsonConvert.DeserializeObject(ln, typeof(Command)); //发来的消息必须符合Command类型定义
if (msg.Num > 0) //服务器程序只支持访问请求。(按照约定,如果Num<0,则为返回信息,而不是主动发起信息)
{
var ReceiveTime = DateTime.Now;
var type = GateWay.GateWay.GetEntityType(msg.Type); //查找Command内含的Data对应的信令对象类型
var message = msg.Data.ToObject(type); //将Command内含的Data实际转换为强类型的信令对象。
var ret = ExecuteCmd(session, message); //执行命令,得到返回结果对象。
if (ret != null)
GateWay.GateWay.CheckCommandResultype(message.GetType(), ret.GetType()); //判断返回类型是否正确,增强系统稳定性。
var t = ret != null ? ret.GetType().FullName : typeof(object).FullName; //返回信息的Type名称。如果返回null,则为“object”。
var b = ret != null ? JToken.FromObject(ret) : null; //将返回对象转换为json的Token,方便各种客户端解析。
var msg2 = SendMessage(session, t, b, -msg.Num); //发送返回值给Session。
}
#if !DEBUG
}
catch (System.Exception ex)
{
var str = ex.Message;
while (ex.InnerException != null)
{
ex = ex.InnerException;
str += ex.ToString(); // ex.Message;
}
var ret = new Common.Models.CommandException
{
Message = str
};
try
{
var t = ret.GetType().FullName;
var b = JObject.FromObject(ret);
SendMessage(session, t, b, -msg.Num);
}
catch { }
}
#endif
}
另外一种方法是在c#最近6、7年的高版本中支持的,使用了.net的 ConditionalAttribute 标签来告诉编译器如何进行条件编译。
#30
使用return就可以啦
#1
把try catch去掉就能停下来……
#2
在catch中加个messagebox,来弹出错误信息,或在catch中将错误信息写到日志中或文本框中就能知道是什么错误了
#3
或者在for之前设置一些变量来记录一些信息咯
#4
按f5,或者调试-开始调试
在catch处下断点遇到异常就会停下来
在catch处下断点遇到异常就会停下来
#5
catch加断点不就可以了?????
#6
try
{ }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
{ }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
#7
加断点,f10 单步执行
#8
#9
catch加断点
不要用e.message
而直接e.tostring
能看到详细的错误信息
然后再看循环变量是多少,就能知道到底循环到第几次出错
不要用e.message
而直接e.tostring
能看到详细的错误信息
然后再看循环变量是多少,就能知道到底循环到第几次出错
#10
用宏编译。
#if DEBUG
你的code
#else
try{ 你的code} catach....
#endif
#if DEBUG
你的code
#else
try{ 你的code} catach....
#endif
#11
我那会表达的可能不清楚。我的意思是,不知道哪里抛出的异常。在catch处可以停下,并且看到异常信息,但是不知道是哪一行代码抛出来的。我上午找了找,有这样一个解决 办法。但是也有弊端,就是会捕捉到很多不需要的异常。
#12
去掉try catch 开发完毕重构代码的时候再加上try catch我一般我这么开发的
#13
貌似有一个叫做 Exception.StrackMessage
#14
那怎么知道现在这个程序执行到哪里了呢?
#15
你世界把try catch注释掉 然后调试 不就知道哪一步的问题了么。。。
#16
catch(Exception ex){
Console.WriteLine(ex)
}
Console.WriteLine(ex)
}
#17
异常的堆栈跟踪会提示代码出错的位置的, 如果你需要这个确切的信息, 需要自己写(扩展)方法从异常堆栈中取出来.
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等,
这些信息全不都在 Exception 里
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等,
这些信息全不都在 Exception 里
#18
http://msdn.microsoft.com/zh-cn/library/system.exception(VS.80).aspx
#19
能不能写一句代码,谢谢,不太懂。。。
#20
#21
你要的那些信息你可以自己去写相应的log。
还有你要知道,你执行的cs文件实际上是编译好的dll。所以你的异常你是想做什么,这个得想清楚
还有你要知道,你执行的cs文件实际上是编译好的dll。所以你的异常你是想做什么,这个得想清楚
#22
f5
调试
调试
#23
你可以catch(Exception ex){
//这里看是抛异常还是弹出到界面
......
//有异常也继续执行
continue;
}
//这里看是抛异常还是弹出到界面
......
//有异常也继续执行
continue;
}
#24
把光标放到 try 上按F9,然后运行程序就会停到try的地方,然后按F10一步一步走,等出现异常的时候就会跳到catch;
由于你刚才是按F10走到catch的,你当然就知道错在哪了
由于你刚才是按F10走到catch的,你当然就知道错在哪了
#25
那你在循环里面处理 try catch不就行了么;
try { }
catch (Exception ex)
{
contiune;
}
try { }
catch (Exception ex)
{
contiune;
}
#26
1. System.Exception.StackTrace 属性可以标识 发生异常的 应用程序路径和行号。
2. 其实在捕获到了异常就 for 循环就停了下来,然后处理你的catch代码,不建议try...catch一大范围代码,因为try...catch 是要记录追踪的,耗性能,能缩小范围尽量缩小。改到for循环里面似乎更好些.
2. 其实在捕获到了异常就 for 循环就停了下来,然后处理你的catch代码,不建议try...catch一大范围代码,因为try...catch 是要记录追踪的,耗性能,能缩小范围尽量缩小。改到for循环里面似乎更好些.
#27
使用“条件编译”指令,只有在 !DEBUG 时才应该有 try...catch 代码被编译进去。
#28
晕死。不知道编程的目的是开发大系统呢?还是玩儿点几十行的小程序呢?
#29
我们经常很谨慎地说“如果是在DEUG状态下,那么就不要 try...catch”。可能不太聪明的人,容易忘记注意这里的前提条件,而是总想“简单地”纠结于是非结论,从来不注意条件。
debug跟release的目的不同。debug时你当然应该尽可能早地让异常抛出来。这是根本的区别。
有两种主要的写法。一种是比较古老的写法,至少有30年历史,大量程序都是这样写的:
另外一种方法是在c#最近6、7年的高版本中支持的,使用了.net的 ConditionalAttribute 标签来告诉编译器如何进行条件编译。
debug跟release的目的不同。debug时你当然应该尽可能早地让异常抛出来。这是根本的区别。
有两种主要的写法。一种是比较古老的写法,至少有30年历史,大量程序都是这样写的:
public static void Execute(ServerSession session, string ln)
{
Command msg = null;
#if !DEBUG
try
{
#endif
msg = (Command)JsonConvert.DeserializeObject(ln, typeof(Command)); //发来的消息必须符合Command类型定义
if (msg.Num > 0) //服务器程序只支持访问请求。(按照约定,如果Num<0,则为返回信息,而不是主动发起信息)
{
var ReceiveTime = DateTime.Now;
var type = GateWay.GateWay.GetEntityType(msg.Type); //查找Command内含的Data对应的信令对象类型
var message = msg.Data.ToObject(type); //将Command内含的Data实际转换为强类型的信令对象。
var ret = ExecuteCmd(session, message); //执行命令,得到返回结果对象。
if (ret != null)
GateWay.GateWay.CheckCommandResultype(message.GetType(), ret.GetType()); //判断返回类型是否正确,增强系统稳定性。
var t = ret != null ? ret.GetType().FullName : typeof(object).FullName; //返回信息的Type名称。如果返回null,则为“object”。
var b = ret != null ? JToken.FromObject(ret) : null; //将返回对象转换为json的Token,方便各种客户端解析。
var msg2 = SendMessage(session, t, b, -msg.Num); //发送返回值给Session。
}
#if !DEBUG
}
catch (System.Exception ex)
{
var str = ex.Message;
while (ex.InnerException != null)
{
ex = ex.InnerException;
str += ex.ToString(); // ex.Message;
}
var ret = new Common.Models.CommandException
{
Message = str
};
try
{
var t = ret.GetType().FullName;
var b = JObject.FromObject(ret);
SendMessage(session, t, b, -msg.Num);
}
catch { }
}
#endif
}
另外一种方法是在c#最近6、7年的高版本中支持的,使用了.net的 ConditionalAttribute 标签来告诉编译器如何进行条件编译。
#30
使用return就可以啦