如何在出错时优雅地退出我的应用程序?

swo*_*978 2 c# vb.net asp.net error-handling

这是一个我的真实世界编程缺乏经验的问题.我有一个函数调用其他三个函数:

Public Sub StartService()
    RunSearch()
    SaveMessages()
    DeleteMessages()
End Sub
Run Code Online (Sandbox Code Playgroud)

RunSearch(), SaveMessages() and DeleteMessages()我使用Try Catch语句的每个方法中捕获错误.现在我捕获错误并在RunSearch()错误输出时写入错误日志,但我也得到两个错误SaveMessages(),DeleteMessages()因为这些函数依赖于RunSearch()不返回错误.我正在尝试建立一个错误捕获基础的好,所以我不只是想在出现错误时杀死应用程序.我的问题是:如果发生错误,我怎样才能优雅地停止执行RunSearch().

djn*_*jna 5

RunSearch记录问题后为什么不重新抛出异常?

如果您不想SaveMessages()RunSearch()失败时调用,则不要以这种方式编码.

我的一般想法是每个方法的接口都指定一个"协议".它必须在出现问题时陈述其行为.方法包括:

  1. 如果我收到错误,我将终止该过程.这非常极端,限制了方法的可重用性.
  2. 我会返回一个计数或状态代码或某些东西.由您决定是否检查以及是否有任何特定的状态代码表示可以安全地调用其他方法.我宁愿不依赖客户端来记住检查状态代码.
  3. 如果我失败了,我会留下一些东西,以便随后的处理能够得到理解.例如,如果我的工作是创建链接列表,那么在发生错误时我不会留下悬空指针或初始化列表.您可能会得到一个空列表,但至少良好的后续处理将起作用.这往往意味着与其他方法达成某种程度的一致(即耦合).这通常是最好的方法,特别是在结合良好的问题记录时.
  4. 如果我不能做这项工作,我会抛出异常.如果再次调用,则异常将指示是否有一些事情可能会在以后运行(我使用了TransientException和InvalidRequestException).异常是有用的,因为客户端不能(对于Java检查的异常)意外地忽略它们.在处理诸如"无法打开数据库"之类的问题时,这似乎是合理的.我们真的不希望人们误以为"甚至无法进入数据库","这个人没有犯罪记录".