如何在try catch中判断问题出在哪一行

时间:2022-04-22 10:35:10
在Main方法中有一个for循环,里边有一些操作。整个for循环用try catch住。

那么,一旦出现异常,就会catch住,但是不会抛到VS中。但是在开发的时候,有没有什么办法让程序在异常处停下来呢?

30 个解决方案

#1


把try catch去掉就能停下来……

#2


在catch中加个messagebox,来弹出错误信息,或在catch中将错误信息写到日志中或文本框中就能知道是什么错误了

#3


或者在for之前设置一些变量来记录一些信息咯

#4


按f5,或者调试-开始调试

在catch处下断点遇到异常就会停下来

#5


catch加断点不就可以了?????

#6


try
            { }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

#7


加断点,f10 单步执行

#9


catch加断点
不要用e.message
而直接e.tostring
能看到详细的错误信息
然后再看循环变量是多少,就能知道到底循环到第几次出错

#10


用宏编译。
#if DEBUG
你的code
#else
try{ 你的code} catach....
#endif

#11


引用 4 楼 caozhy 的回复:
按f5,或者调试-开始调试

在catch处下断点遇到异常就会停下来


我那会表达的可能不清楚。我的意思是,不知道哪里抛出的异常。在catch处可以停下,并且看到异常信息,但是不知道是哪一行代码抛出来的。我上午找了找,有这样一个解决 办法。但是也有弊端,就是会捕捉到很多不需要的异常。

#12


去掉try catch 开发完毕重构代码的时候再加上try catch我一般我这么开发的

#13


貌似有一个叫做 Exception.StrackMessage

#14


引用 13 楼 qq34196940 的回复:
貌似有一个叫做 Exception.StrackMessage


那怎么知道现在这个程序执行到哪里了呢?

#15


你世界把try catch注释掉 然后调试 不就知道哪一步的问题了么。。。

#16


catch(Exception ex){
Console.WriteLine(ex)
}

#17


异常的堆栈跟踪会提示代码出错的位置的, 如果你需要这个确切的信息, 需要自己写(扩展)方法从异常堆栈中取出来. 
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等, 
这些信息全不都在 Exception 里

#18


http://msdn.microsoft.com/zh-cn/library/system.exception(VS.80).aspx

#19


引用 17 楼 a6711145 的回复:
异常的堆栈跟踪会提示代码出错的位置的, 如果你需要这个确切的信息, 需要自己写(扩展)方法从异常堆栈中取出来. 
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等, 
这些信息全不都在 Exception 里


能不能写一句代码,谢谢,不太懂。。。

#20


该回复于2014-12-06 19:48:27被版主删除

#21


你要的那些信息你可以自己去写相应的log。

还有你要知道,你执行的cs文件实际上是编译好的dll。所以你的异常你是想做什么,这个得想清楚

#22


f5  
调试

#23


你可以catch(Exception ex){
//这里看是抛异常还是弹出到界面
......
//有异常也继续执行
continue;

#24


把光标放到 try 上按F9,然后运行程序就会停到try的地方,然后按F10一步一步走,等出现异常的时候就会跳到catch;

由于你刚才是按F10走到catch的,你当然就知道错在哪了

#25


 那你在循环里面处理 try catch不就行了么;
try { }
            catch (Exception ex)
            {
                    contiune;
            }

#26


1. System.Exception.StackTrace 属性可以标识 发生异常的 应用程序路径和行号。
2. 其实在捕获到了异常就 for 循环就停了下来,然后处理你的catch代码,不建议try...catch一大范围代码,因为try...catch 是要记录追踪的,耗性能,能缩小范围尽量缩小。改到for循环里面似乎更好些.

#27


引用 楼主 sundacheng1989 的回复:
在Main方法中有一个for循环,里边有一些操作。整个for循环用try catch住。

那么,一旦出现异常,就会catch住,但是不会抛到VS中。但是在开发的时候,有没有什么办法让程序在异常处停下来呢?


使用“条件编译”指令,只有在 !DEBUG 时才应该有 try...catch 代码被编译进去。

#28


引用 24 楼 porenasckx 的回复:
把光标放到 try 上按F9,然后运行程序就会停到try的地方,然后按F10一步一步走,等出现异常的时候就会跳到catch;

由于你刚才是按F10走到catch的,你当然就知道错在哪了


晕死。不知道编程的目的是开发大系统呢?还是玩儿点几十行的小程序呢?

#29


我们经常很谨慎地说“如果是在DEUG状态下,那么就不要 try...catch”。可能不太聪明的人,容易忘记注意这里的前提条件,而是总想“简单地”纠结于是非结论,从来不注意条件。

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处下断点遇到异常就会停下来

#5


catch加断点不就可以了?????

#6


try
            { }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

#7


加断点,f10 单步执行

#8


#9


catch加断点
不要用e.message
而直接e.tostring
能看到详细的错误信息
然后再看循环变量是多少,就能知道到底循环到第几次出错

#10


用宏编译。
#if DEBUG
你的code
#else
try{ 你的code} catach....
#endif

#11


引用 4 楼 caozhy 的回复:
按f5,或者调试-开始调试

在catch处下断点遇到异常就会停下来


我那会表达的可能不清楚。我的意思是,不知道哪里抛出的异常。在catch处可以停下,并且看到异常信息,但是不知道是哪一行代码抛出来的。我上午找了找,有这样一个解决 办法。但是也有弊端,就是会捕捉到很多不需要的异常。

#12


去掉try catch 开发完毕重构代码的时候再加上try catch我一般我这么开发的

#13


貌似有一个叫做 Exception.StrackMessage

#14


引用 13 楼 qq34196940 的回复:
貌似有一个叫做 Exception.StrackMessage


那怎么知道现在这个程序执行到哪里了呢?

#15


你世界把try catch注释掉 然后调试 不就知道哪一步的问题了么。。。

#16


catch(Exception ex){
Console.WriteLine(ex)
}

#17


异常的堆栈跟踪会提示代码出错的位置的, 如果你需要这个确切的信息, 需要自己写(扩展)方法从异常堆栈中取出来. 
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等, 
这些信息全不都在 Exception 里

#18


http://msdn.microsoft.com/zh-cn/library/system.exception(VS.80).aspx

#19


引用 17 楼 a6711145 的回复:
异常的堆栈跟踪会提示代码出错的位置的, 如果你需要这个确切的信息, 需要自己写(扩展)方法从异常堆栈中取出来. 
使用 vs 编译程序的时候在错误列表可以看到错误信息, 出错的位置, 出错的项目文件名等等, 
这些信息全不都在 Exception 里


能不能写一句代码,谢谢,不太懂。。。

#20


该回复于2014-12-06 19:48:27被版主删除

#21


你要的那些信息你可以自己去写相应的log。

还有你要知道,你执行的cs文件实际上是编译好的dll。所以你的异常你是想做什么,这个得想清楚

#22


f5  
调试

#23


你可以catch(Exception ex){
//这里看是抛异常还是弹出到界面
......
//有异常也继续执行
continue;

#24


把光标放到 try 上按F9,然后运行程序就会停到try的地方,然后按F10一步一步走,等出现异常的时候就会跳到catch;

由于你刚才是按F10走到catch的,你当然就知道错在哪了

#25


 那你在循环里面处理 try catch不就行了么;
try { }
            catch (Exception ex)
            {
                    contiune;
            }

#26


1. System.Exception.StackTrace 属性可以标识 发生异常的 应用程序路径和行号。
2. 其实在捕获到了异常就 for 循环就停了下来,然后处理你的catch代码,不建议try...catch一大范围代码,因为try...catch 是要记录追踪的,耗性能,能缩小范围尽量缩小。改到for循环里面似乎更好些.

#27


引用 楼主 sundacheng1989 的回复:
在Main方法中有一个for循环,里边有一些操作。整个for循环用try catch住。

那么,一旦出现异常,就会catch住,但是不会抛到VS中。但是在开发的时候,有没有什么办法让程序在异常处停下来呢?


使用“条件编译”指令,只有在 !DEBUG 时才应该有 try...catch 代码被编译进去。

#28


引用 24 楼 porenasckx 的回复:
把光标放到 try 上按F9,然后运行程序就会停到try的地方,然后按F10一步一步走,等出现异常的时候就会跳到catch;

由于你刚才是按F10走到catch的,你当然就知道错在哪了


晕死。不知道编程的目的是开发大系统呢?还是玩儿点几十行的小程序呢?

#29


我们经常很谨慎地说“如果是在DEUG状态下,那么就不要 try...catch”。可能不太聪明的人,容易忘记注意这里的前提条件,而是总想“简单地”纠结于是非结论,从来不注意条件。

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就可以啦