【问题标题】:Which exception to throw when not finding a WebForms control which "should" be there找不到“应该”存在的 WebForms 控件时抛出哪个异常
【发布时间】:2011-04-27 22:08:45
【问题描述】:

我们有一个 WebForms 控件,它要求提供另一个实现 ITextControl 的控件的 ID。

如果没有具有该 ID 的控件或找到控件但它没有实现接口,我们应该抛出什么异常?

var text = Page.FindControl(TextProviderId) as ITextControl;

if (text == null) {
   throw new WhatEverException(...);
...

我们是否应该将它分成两种情况,如果没有具有该 ID 的控件,则抛出一个异常,如果该控件没有实现 ITextControl,则另一种?如果是这样,那么我们应该使用哪些异常?

【问题讨论】:

    标签: asp.net exception-handling webforms


    【解决方案1】:

    如果控件真的应该在那里,我会说你的网络表单如果丢失则处于无效状态,所以我可能会选择InvalidOperationException

    当方法调用对于对象的当前状态无效时引发的异常。

    这将适用于这两种情况;无论控件是否丢失或没有实现预期的接口,包含的对象都处于无效状态。

    如果这是由于各种原因预计会发生的场景(假设您正在制作一些其他人会针对它进行编程的工具,而这是他们很可能会产生的情况),也许您应该创建两个自定义异常非常清楚正在发生的事情以及如何纠正它(例如 ControlNotFoundExceptionInterfaceNotFoundException 或类似的东西)。

    【讨论】:

    • 当然还需要调用它,并提供详细的消息来描述应该存在的控件。
    【解决方案2】:

    【讨论】:

    • @Anonymous downvoter:如链接的 MSDN 文章中所述,此例外适用于参数不属于允许值集的情况,其中“允许值”具有不同的含义,具体取决于上下文。如果传递的 ID 不代表实现某个接口的现有控件,则它不属于允许的参数集。
    【解决方案3】:

    您是否应该将它们分成不同的异常可能主要取决于您是否认为任何人都可能想要在不同的 catch 块中区分这两个异常。

    不知道这将如何使用,这似乎是一种应该引起开发人员注意的错误,其中重写代码以指向正确的文件或实现正确的接口是正确的操作,而不是实现一个 try-catch 并给用户友好的错误信息。因此,我只想抛出一个ArgumentException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      相关资源
      最近更新 更多