http://bbs.csdn.net/topics/391053174
看了SP的 回复,那么到底正确的catch应该怎么使用
------解决思路----------------------
一、异常并不需要手动去层层抛出,如果某一层没有catch,异常就会向上抛出,直到碰到catch语句。
异常的StactTrace会告诉你异常的层次:
class Program
{
static void Main(string[] args)
{
try { A(); }
catch (Exception e) { Console.WriteLine(e); }
}
static void A()
{
B();
}
static void B()
{
C();
}
static void C()
{
D();
}
static void D()
{
throw new Exception("oops...");
}
/* 结果
System.Exception: oops...
at ConsoleApplication3.Program.D() in ...\Program.cs:line 35
at ConsoleApplication3.Program.C() in ...\Program.cs:line 31
at ConsoleApplication3.Program.B() in ...\Program.cs:line 27
at ConsoleApplication3.Program.A() in ...\Program.cs:line 23
at ConsoleApplication3.Program.Main(String[] args) in ...\Program.cs:line 18
*/
二、如果catch了,再new一个异常抛出,那么,该异常就是一个新的异常,它的StrackTrace指出异常发生的位置,该位置已经不是‘原始’异常的位置了。
把上述例子的A方法换成如下写法,结果的StackTrace就不一样了:
static void A()
{
try
{
B();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/*
System.Exception: oops...
at ConsoleApplication3.Program.A() in ...\Program.cs:line 29
at ConsoleApplication3.Program.Main(String[] args) in ...\Program.cs:line 18
*/
三、因此,如果对异常不做处理,一般不catch,因为它会扰乱异常的StackTrace信息。只有在某些情况下,你不希望暴露原始的异常,抛出新的异常才有意义。
四、如果你要作日志,可以象如下代码抛出原始异常,该throw不会破坏原始异常:
try
{
B();
}
catch (Exception e)
{
Log("something wrong in A method: {0}", e.Message);
throw; // 注意这里没有e,也没有new Exception...,原始异常将得到保留
}
------解决思路----------------------
http://blog.csdn.net/jiankunking/article/details/43936729
请参考这个!
------解决思路----------------------
你这是事后补救,处理BUG的思路.跟软件正常的try,catch不是一回事
加try,catch并不是为了解决bug问题
如果你在调试阶段,不加try,反而更容易找到bug在哪里,编译器就会自动断点在出问题的代码行上,省了你自己翻日志还找不到具体的原因
而如果真正运行,很多情况都会导致底层抛出异常
这些一般都是IO操作引起的
比如写文件失败,比如连接数据库失败,比如连接以太网失败,比如以太网读取数据超时
类似这种问题,就应该通过try捕获异常,然后程序自动进行重试,而不是遇到啥P大的问题都给用户弹出个对话框
用户看不懂,也不知道该如何解决.
这种异常写进文件也没用.因为是很正常的现象,而不是什么bug