c# – .NET:利用现有类型避免自定义异常,但是哪些?

请考虑以下代码(ASP.NET / C#):

private void Application_Start(object sender, EventArgs e)
{
    if (!SetupHelper.SetUp())
    {
        throw new ShitHitFanException();
    }
}

我从来没有过于犹豫过简单地滚动我自己的异常类型,主要是因为我发现(不良做法,或者不是)大多数合理的描述性类型名称给了我们足够的开发人员来了解发生了什么以及为什么可能发生了什么事.有时,现有的.NET异常类型甚至可以满足这些需求 – 无论消息如何.

在这个特定的场景中,仅为了演示目的,如果SetUp没有正确完成(由其返回值指示),应用程序应该死于可怕的,可耻的死亡,但我找不到.NET中已经存在的异常类型够了;不过,我相信一个人会在那里而我根本就不知道.

Brad Abrams发布了this article that lists some of the available exception types.我说了一些,因为这篇文章是从2005年开始的,虽然我试图保持最新,但这是一个更合理的假设,即我仍然没有意识到未来的框架版本中添加了更多.

当然,Visual Studio通过Intellisense为您提供了一个格式良好,可滚动的异常列表 – 但即使在分析这些异常时,我也发现这些情况似乎不足以满足这种情况……

ApplicationException: …when a
non-fatal application error occurs

The name seems reasonable, but the
error is very definitely fatal – the
app is dead.

ExecutionEngineException: …when
there is an internal error in the
execution engine of the CLR

Again, sounds reasonable,
superficially; but this has a very
definite purpose and to help me out
here certainly isn’t it.

HttpApplicationException: …when
there is an error processing an HTTP
request

Well, we’re running an ASP.NET
application! But we’re also just
pulling at straws here.

InvalidOperationException: …when a
call is invalid for the current state
of an instance

This isn’t right but I’m adding it to
the list of ‘possible should you put a
gun to my head, yes’.

OperationCanceledException: …upon
cancellation of an operation the
thread was executing

Maybe I wouldn’t feel so bad using
this one, but I’d still be hijacking
the damn thing with little right.

你甚至可能会问为什么我想在这里提出一个例外,但想法是找出如果我这样做那么你知道这种情况的适当例外吗?基本上,我们可以在多大程度上依靠.NET来理解并保持理性?

看起来你正试图处理一个你无法恢复的错误发生的情况.当我遇到这些情况时,我会尽力失败并迅速失败.我通常避免在这里重复使用已知异常,因为这不是我想要恢复的情况.我希望它失败.

我通常解决这个问题的方法是使用合同.

private void Application_Start(object sender, EventArgs e)
{
  // If this doesn't work why keep executing???
  Contract.Requires(SetupHelper.SetUp());
  ...
}

注意:根据项目限制,我将使用BCL中的.Net合同或我自己的变体

public static class Contracts {
  private sealed class ContractException : Exception { ... }
  public static void Requires(bool value) { 
    if (!value) {
      throw new ContractException(); 
    }
  }
}

我的自定义解决方案不如BCL合约,但是当BCL合约因任何原因无法使用时,大部分工作都会完成.

相关文章
相关标签/搜索