当前位置: 代码迷 >> C# >> 关于Try,Catch的准确用法
  详细解决方案

关于Try,Catch的准确用法

热度:16   发布时间:2016-05-05 03:23:24.0
关于Try,Catch的正确用法?
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
请参考这个!
------解决思路----------------------
引用:
习惯所有的catch ex都打印到日志。这样也不怕出问题有问题查找不到。

你这是事后补救,处理BUG的思路.跟软件正常的try,catch不是一回事

加try,catch并不是为了解决bug问题
如果你在调试阶段,不加try,反而更容易找到bug在哪里,编译器就会自动断点在出问题的代码行上,省了你自己翻日志还找不到具体的原因

而如果真正运行,很多情况都会导致底层抛出异常
这些一般都是IO操作引起的
比如写文件失败,比如连接数据库失败,比如连接以太网失败,比如以太网读取数据超时
类似这种问题,就应该通过try捕获异常,然后程序自动进行重试,而不是遇到啥P大的问题都给用户弹出个对话框
用户看不懂,也不知道该如何解决.
这种异常写进文件也没用.因为是很正常的现象,而不是什么bug