2009-12-29 89 views
5

当WCF服务关闭时,我会捕获这样的异常。如何处理捕捉到的异常

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

但我不知道该怎么在catch做block.I只能返回List<ProjektyEntity>类型的对象我想要写一个信息给用户,内容如“服务被关闭“我的表示层是ASP.NET MVC。这种情况有没有策略?

回答

15

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

捕获它并重新调用null或空列表将会导致您可以做的最糟糕的事情,因为很难调试错误来自哪里,甚至根本就没有发生错误。如果你这样做,你会让开发者把头发拉出来。

捕捉异常并将其重新抛出为throw e;也很糟糕,因为您丢失了原始堆栈。只有在出现错误时,您才需要进行特殊清理,否则使用throw;进行重新配置是有好处的。通常情况并非如此。如果你已经完成了应该完成的清理工作,无论是否存在错误,它都属于finally子句。

所以一般情况下,除非有一些明智的做法,你可以从错误中恢复,让异常传播给调用者。这是如何设计例外的。

有一些时候,你可能要赶上一个例外,添加更多的信息(例如,用于日志记录),在这种情况下,你应该确保您使用的InnerException以避免丢失原来的信息:

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

但总的来说最好不要这样做,除非你有一个很好的理由。这样做可以防止用户捕获特定类型的异常 - 它们将捕获您的异常,然后他们需要打开InnerException的类型。不好玩。让调用者看到最初的异常。

+2

这听起来像你应该只在你的表示层处理这个异常 - 例外应该是例外。如果您可以根据发生的异常执行不同的逻辑路径,则只处理异常。 – 2009-12-29 11:14:16

4

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

8

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

  • 显示错误并返回null。干净简单,但不灵活。在使用此功能的每种情况下,可能都不是您想要的。
  • 不要捕捉它,让调用者捕获这个异常。它可以更容易地确定从调用函数中的适当的响应(即,显示一条消息/重试在几秒钟/等)
  • 捕获它,并抛出一个新ServiceNotAvailableException略多于选项2较为复杂,但将让你的代码更清晰。
  • 只返回null。可能是最不可取的方法,除非这种服务被关闭是常见的,没有什么大不了的。
1

创建具有足够的调试信息的异常对象,并将其扔调用方法

2

不应该例外被捕获并在这方面处理。一般来说,它需要在更高级别上处理任何控制台。

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

4

有几种方法:

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)抓住它,然后返回一个错误代码(如空),所以调用者不需要使用异常处理来处理它(但没有真正的好处,这样做)

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

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 

     } 
    }