自定义异常vs内置异常,具有非常描述性的消息

时间:2011-04-04 22:22:17

标签: exception exception-handling

我今天遇到了一个有趣的情况:我有一个带有设置文件的小应用程序,文档中有详细记录,但如果文件不存在,那会更好:抛出filenotfoundexception并给出一个非常抑郁的设置文件不可用的消息,或创建一个自定义异常(已经缺点是这样做的工作,即使它需要花费10分钟),名为SettingsFileNotFoundException。这将立即给它,问题是什么。

第一种方法(标准异常+消息)的问题是,在团队环境中,只有在严格遵循程序的情况下,它才会起作用。

虽然我对这里的语言细节并不感兴趣,但语言是C#。

哪个更好?

由于

1 个答案:

答案 0 :(得分:3)

如果您在不同级别(使用不同的调用方法)捕获SettingsFileNotFoundException,那么创建自定义异常可能是有意义的,因为您可能需要确定错误的确切内容。一个过于简化的例子如下:

void startingMethod()
{
    try
    {
        secondMethod();
        thirdMethod();
    }
    catch (SettingsFileNotFoundException sfnfe)
    {
        // Handle all SettingsFileNotFoundException issues here.
    }
    catch (Exception ex)
    {
        // Handle all other exceptions here.
    }
}

void secondMethod()
{
    // TODO: secondMethod actions.
    var fileName = SomeLogicSpecificToSecondMethodHere();

    if (!File.Exists(fileName))
    {
        throw new SettingsFileNotFoundException("...");
    }
}

void thirdMethod()
{
    // TODO: thirdMethod actions.
    var fileName = SomeOtherLogicSpecificToThirdMethodHere();

    if (!File.Exists(fileName))
    {
        throw new SettingsFileNotFoundException("...");
    }
}

在上面的示例中,程序搜索多个设置文件,因此具有多个使用该异常的throw ()语句。并且嵌套异常捕获允许以相同的方式处理所有这些异常,而无需在两个辅助方法中放置相同的代码。在这里,将自定义异常作为不同类型允许以与错误处理的其余部分不同的方式处理特定异常。

但是假设你没有这样做错误处理,你描述的第一种方法更好,因为它是一般化的。为什么要创建一个只能抛出一次的异常?我假设您正在缓存变量中的设置,因此您不需要每五秒读取一次文件,从而可以在应用程序初始化期间将新异常限制为一次。

因此,在您的情况下,除非您很可能将代码扩展为将来使用更复杂的错误处理,否则您应该只在FileNotFoundException上使用非常特定的消息。