方法定义或调用中的异常处理?

时间:2011-11-16 18:10:01

标签: c# exception-handling

我想知道是否有合适的地方来处理异常。 我应该在我的方法中处理它还是应该在方法调用中处理它?或者它是否重要?

我很抱歉,但是我找不到任何关于此的信息(谷歌搜索“异常处理范围”没有返回我想要的内容。)

示例:

// this way...
void readFile(string file)
{
    try
    {
        /* do my stuff */
    }
    catch(Exception exception)
    {
        /* handle exception */
    }
}

int main()
{
    readFile(file);
}

// or this way?
void readFile(string file)
{
    /* do my stuff */
}

int main()
{
    try
    {
        readFile(file);
    }
    catch(Exception exception)
    {
        /* handle exception */
    }
}

提前致谢。

5 个答案:

答案 0 :(得分:4)

通常,您希望在有意义的情况下处理错误。

如果您在上面的示例中想要尝试读取文件,如果失败则读取默认文件,您可以像第一个示例中那样处理它。

如果readFile操作失败对于main()的其余部分至关重要,那么你需要将异常传递给它,这样它就可以处理readFile()失败的任何后果,这就像你的第二个例子中那样

当然,您总是可以在方法中处理错误(或一些可能的异常)并重新抛出或者让一些错过(或者其他)。

实际上它的程序流程确定了异常处理的位置。处理有意义的例外情况。

答案 1 :(得分:3)

第一种方法通常更好,因为所有文件都由readFile处理,而调用readFile的代码不必担心文件处理问题。但是,您可以从readFile返回一个布尔值,告诉调用者操作是否成功:

bool readFile(string file)
{
    try {
        /* do my stuff */
        return true;
    } catch(Exception exception) {
        /* handle exception */
        return false;
    }
}

答案 2 :(得分:1)

如果您可以处理异常,从中恢复并继续,那么您应该立即执行此操作。

另一方面,如果你没有办法处理异常,那么最好的办法就是让异常传播到调用堆栈中。最终,顶级代码将被强制捕获异常并将其记录/显示给用户,否则应用程序将崩溃。

答案 3 :(得分:1)

如果您实际上计划在特定情况下执行某些操作(例如,与DB通信并发生死锁异常,您可能希望重试数据库操作),则只处理异常。如果你只是想做一些通用的异常处理操作(例如记录每个异常),尽可能在最高级别(通常是UI)执行它,并且不要在任何地方使用异常处理程序使代码混乱 - 只需让异常冒泡。 / p>

答案 4 :(得分:0)

最佳做法是让上层处理异常。想象一下,您正在将低级文件阅读器打包到库中并在那里处理异常。您并没有让代码的用户能够以他们想要的方式处理异常。