2010-12-12 142 views
9

这是一个关于best .net练习的问题。我总是捕获并存储关于我的所有网页和窗口形式的应用程序异常信息如下:如何处理异常?

  1. 包围尝试catch(异常除外)
  2. 对于除前层的任何一层,每个方法抛出例外层以上
  3. 在前一层,将异常记录到日志文件(通常使用log4config.dll)并向用户提供了一个用户友好的消息。

这是处理异常的最佳方式吗?或者我应该在下一个项目中做一些不同的事情?

+0

你是什么意思1.Surrounded与尝试捕捉每一个方法(例外的例外) – Stilgar 2010-12-12 19:29:00

+0

尝试{//做一些事情}赶上(例外的例外){//做一些事情} – InfoLearner 2010-12-13 00:38:13

回答

2

下面的代码是有问题的,因为它会覆盖e原来的堆栈跟踪,这使得问题更加难以诊断:

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw e; // re-throw; overwrites original stacktrace in 'e' 
    } 
} 

下面的代码不具有上述堆栈跟踪覆盖问题,但仍是不必要的冗长:

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw; // re-throw; preserves original stacktrace in 'e' 
    } 
} 

这两个会更好写如下。这是因为,如果您在catch块正在做的唯一的事情是重新抛出异常,就没有必要写catch块都:

public void Foo() { 
    Bar(); 
} 
+4

确切的说,“扔ê “更糟,因为它丢失了堆栈并重新创建一个,它应该只是”抛出“而没有任何参数。 – 2010-12-12 19:43:00

+0

因此,证明善意的代码使事情变得更加容易:) – 2010-12-12 19:58:01

+0

@Simon - 好的发现。谢谢。我更新了我的答案。 – 2010-12-12 20:40:50

6

得到我不会增加1 & 2,除非我有一些具体的原因;例如改变(包装)该消息;没有必要,因为例外情况无论如何都会上升。如果做得不正确,你可能会意外地删除所有重要的堆栈跟踪(throw; vs throw ex; - 首选首选)。

-1

这里是如何到处理异常。

public void method1(){ 
    try{ 
     .... 
     // all the code goes here 
     // declare any helper methods throw throwable 
     // eg: private boolean check1() throws Throwable{ ...} 
     .... 
    }catch(Throwable t){ 
     System.out.println("oops...error...good luck debugging. "); 
    } 
} 
+0

没有人可以建议采用更懒的方式来处理这种异常:) – rana 2011-11-28 21:43:03