可以强制开发人员处理特定的异常吗?

goo*_*ate 4 .net c# programming-languages interface exception

从本质上讲,我想要一个特殊形式的Interface异常,需要任何使用我的对象的人用特定的catch实现来包装它.

我有一个将数据发送到另一个主机的对象.我希望现实的实现需要一种方法来处理以下异常:

  • HostNotFoundException
  • InvalidUsernameException
  • AccountExpiredException
  • DataAlreadyExistsException

类似于如何使用一个Interface或一个Abstract类来强制在派生类中创建方法和属性,有什么方法可以强制消费者以我期望的方式实现异常处理?

在类似的说明中,我还想强制方法(通过Interface或Abstract创建)能够生成某些异常.当然它们可能未实现,但我想告诉那个开发人员(谁没有阅读文档)应该考虑他们.

目标

此异常检查的好处是可以实现更强大的错误处理.这将由消费者使用对象和对象创建者来完成.

解?

我能想到的唯一方法是T4模板,但这并不像我想的那样完整.我很乐意看到这种语言本身实现了.

Jim*_*hel 7

除了跳过篮球之外,你不能强迫程序员做任何事情.例如,假设你有一些叫Frob做某事的方法,并且可以抛出FrobinatorException.你希望程序员写:

try
{
    var result = Frob(foo);
}
catch (FrobinatorException)
{
    // handle exception here
}
Run Code Online (Sandbox Code Playgroud)

但你发现他们没有.因此,通过这样定义强迫他们Frob:

public FrobResult Frob(FrobyThing foo, Action FrobinatorExceptionHandler);
Run Code Online (Sandbox Code Playgroud)

然后程序员必须编写如下内容:

var result = Frob(
    foo, 
    () => { /* handle FrobinatorException here */; });
Run Code Online (Sandbox Code Playgroud)

程序员会抱怨不得不这样做,他们最终会写这个:

var StupidExceptionHandler = new Action(() => {});
var result = Frob(foo, StupidExceptionHandler);
Run Code Online (Sandbox Code Playgroud)

现在你的情况比你更糟糕,因为异常被吞噬,这隐藏了错误.如果程序员完全忽略异常处理,那就更好了.至少这种方式你知道什么时候发生错误.

根本没有办法强制进行良好的异常处理.至少,不是在目前存在的C#中.您可以更方便地处理异常,但这样做通常会使吞咽异常更容易隐藏异常.