c# - 使用异常处理错误流程?

标签 c# exception

我有以下模式:

private void MyFunction()
{
    doStuff();

    if (problem())
    {
        cleanup();
        return;
    }

    doMoreStuff();

    if (otherProblem())
    {
        cleanup();
        return;
    }

    doYetMoreStuff();
}

错误清除代码重复。消除这种情况的明显方法是:

private void MyFunction()
{
    try {
        doStuff();

        if (problem()) throw new MyException();

        doMoreStuff();

        if (otherProblem()) throw new MyException();

        doYetMoreStuff();
    }
    catch (MyException)
    {
        cleanup();
        return;
    }
}

但是,错误情况并不是真正的异常 - 这是一个 ASP.Net 页面,查询字符串中的数据错误或没有数据将触发错误情况。异常似乎是消除错误处理重复数据并将其与主代码分离的最明显方法,但据我了解,公认的最佳做法是不要像这样对控制流使用异常。

这样做的习惯做法是什么?

最佳答案

在非异常情况下使用异常并不是一个好主意,尤其是在同一方法中抛出和捕获异常时。更好的方法是使用指示需要清理的 bool 变量,并在 finally block 内执行清理。

var needsCleanup = true;
try {
    doStuff();

    if (problem()) return;

    doMoreStuff();

    if (otherProblem()) return;

    doYetMoreStuff();

    needsCleanup = false;
} finally {
    if (needsCleanup) {
        cleanup;
    }
}

关于c# - 使用异常处理错误流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11345454/

相关文章:

带有源代码行信息的 C++ 异常处理

java - java调用多个oracle存储过程并保持数据一致性

c# - 是否可以使用 C# 在 SQLite 中获取列名(标题)?

c# - 对于编程内容,首选哪些易于使用和设置的基于 PHP 的博客?

c# - Azure 部署 : A route named 'HelpPage_Default' is already in the route collection. 路由名称必须是唯一的。参数名称:名称

c# - 在 C# 中从 C 库中捕获 exit(#)

c# - 如何正确使用 InsertAllOnSubmit() 是否比循环 InsertOnSubmit() 更好?

c# - 如何使用 C# 在 Asp.net 中将数据从 MySQL 导出到 Excel

Python - 尝试控制输入时出错

java - 线程 "main"java.lang.ClassNotFoundException : sample. Main 中的异常 - 为什么?