如何处理捕获的异常

use*_*348 4 .net c# exception-handling

当WCF服务关闭时,我会像这样捕获这个异常.

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

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

Mar*_*ers 14

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

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

捕获异常并重新抛出异常throw e;也是因为丢失了原始堆栈.使用重新抛出throw;是OK有时候,如果你有特殊的清理,你只需要,如果有一个错误的事情.通常情况并非如此.如果你有清理应该做的是否有错误,它属于finally子句.

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

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

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

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

  • 听起来你应该只在表示层中处理这个异常 - 异常应该是例外.如果您可以根据发生的异常遵循不同的逻辑路径,则仅处理异常. (2认同)

Ada*_*ers 7

我在这里可以看到几个选项.确定哪个合适可能取决于应用程序.

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