如何处理捕获的异常

时间:2009-12-29 11:08:08

标签: c# .net exception-handling

当WCF服务关闭时,我会像这样抓住这个例外。

   public List<ProjektyEntity> GetProjekty()
   {
      try
      {
         return this.channel.GetProjekty();
       }
       catch (EndpointNotFoundException exception)
       {
          //what to do at this point ?
       }
    }

但是我不知道在catch块中要做什么。我只能返回List<ProjektyEntity>类型的对象我想给用户写一条消息,比如“服务已关闭” “我的表示层是ASP.NET MVC。这种情况有什么策略吗?

7 个答案:

答案 0 :(得分:14)

有一条简单的规则:如果您不知道如何处理异常,请不要抓住它。

捕获它并重新调整null或空列表将是你可以做的最糟糕的事情,因为它很难调试错误的来源,甚至根本就发生错误。如果你这样做,你就会让开发人员脱掉头发。

捕获异常并将其重新抛出为throw e;也很糟糕,因为您丢失了原始堆栈。如果只有在出现错误时需要进行特殊清理,有时使用throw;进行重新定义是正常的。通常情况并非如此。如果你有清理应该做的是否有错误,它属于finally子句。

所以一般情况下,除非你能从错误中恢复,否则只需让异常传播给调用者。这就是异常的设计方式。

有几次您可能想要捕获异常以添加更多信息(例如,用于记录),在这种情况下,您应该确保使用InnerException以避免丢失原始信息:

try
{
    foo(bar);
}
catch (Exception e)
{
    throw new FooException("Foo failed for " + bar.ToString(), e);
}

但总的来说,除非你有充分的理由,否则最好不要这样做。这样做可以防止用户捕获特定类型的异常 - 它们将捕获您的异常,然后他们需要打开InnerException的类型。不好玩。只需让来电者看到原来的例外情况。

答案 1 :(得分:7)

我可以在这里看到一些选项。确定哪个是合适的可能取决于应用程序。

  • 显示错误并返回null。干净简单,但不灵活。在使用此功能的每种情况下,可能不是您想要的。
  • 不要抓住它,让调用者捕获此异常。可能更容易从调用函数确定适当的响应(即在几秒钟内显示消息/重试/等)
  • 抓住它并抛出一个新的ServiceNotAvailableException 比第二个选项稍微复杂一点,但会让你的代码更清晰。
  • 只需返回null。可能是最不可取的方法,除非此服务失效是常见且没什么大不了的。

答案 2 :(得分:3)

在我看来,你不应该在那一层抓住这个例外;你应该让异常传播到控制器层,让控制器层显示消息。

答案 3 :(得分:3)

有几种方法:

1)不要捕获异常,让调用者(用户界面层)处理它

2)抓住异常以便你可以做任何你需要做的事情,然后重新抛出

catch (EndpointNotFoundException exception) 
{ 
   CleanUpMyOwnState();
   throw;                  // Pass the exception on the to the caller to handle
} 

3)将异常转换为另一种类型(以便在调用者中更容易处理):

catch (EndpointNotFoundException exception) 
{ 
   CleanUpMyOwnState();
   throw new InvalidOperationException("Endpoint was not found", exception);
} 

4)捕获它,然后返回错误代码(例如null),因此调用者不需要使用异常处理来处理它(但这样做没有真正的优势)

5)捕获异常并自行向用户报告错误。这可能是一个坏主意 - 您应该在UI层中保留所有错误报告。

答案 4 :(得分:1)

  

在此上下文中不应该捕获和处理异常。它需要在更高级别处理,通常可以访问任何控制台。

您可以在这里做的最好的事情就是记录具有必要细节的异常并正确地重新抛出。

答案 5 :(得分:0)

创建一个具有足够调试详细信息的异常对象,并将其抛给调用方法

答案 6 :(得分:0)

 public List<ProjektyEntity> GetProjekty()
   {
      try
      {
         return this.channel.GetProjekty();
       }
       catch (EndpointNotFoundException exception)
       {
          'Write here Some Clean Up Codes
          ' Log it somewhere on your server so that you can fix the error

       }
    }