【问题标题】:Replace multiple try catches with a single global try catch block [closed]用一个全局try catch块替换多个try catch [关闭]
【发布时间】:2020-04-02 20:03:24
【问题描述】:

由于我有几个子类,因此我正在尝试使用全局 try catch 异常处理程序 内部有 try catch 的方法。所以基本上我希望父类方法能够捕获所有这些 异常并记录下来。

其中一个常见的是 SQL 异常。

这里创建一个可以捕获错误的通用处理程序的最佳方法是什么?

这是我的应用程序中发生的事情的示例

public class Parent
{
    public void ParentMethod()
    {
        try
        {
            var childClass = new Child();
            var process = childClass.Process();
            if (process)
            {
                // Do this
            }
            else
            {
                // raise new Exception
            }
        }
        catch(Exception ex){
            WriteToErrorLogger.Error(ex)
        }       
    }
}
public class Child
{
    public bool Process()
    {
        try{
            // Do something and save to Database
        }
        catch (SqlException sqlEx)
        {
            // log exception
            return false;
        }
        catch (Exception ex)
        {
            // log exception
            return false;
        }       
    }
}

【问题讨论】:

  • 除非我理解错了,你不能把所有的子try catchs都去掉并使用父级一级吗?所有异常都继承自Exception,因此它们都将在此处被捕获,而无需指定每种异常类型。
  • 好的,但是如果我要扩展错误处理,我怎么知道哪个类引发了错误?
  • 堆栈跟踪会告诉你。还有其他方法可以找到,但这是最简单的
  • 也可以让异常让你的整个进程崩溃。
  • 如果您只想要一个全局异常处理程序,请将其放入程序的main 方法中。在不了解代码的实际上下文的情况下,这是一个很难很好地回答的问题。一般而言,您应该只在您可以实际处理异常或在工作单元边界处捕获异常,如果您不希望异常导致您的应用程序完全失败。

标签: c# exception error-handling


【解决方案1】:

什么意思?做完全相反的事情才有意义

public class Parent
{
    public void ParentMethod()
    {
        try
        {
            var childClass = new Child();
            var process = childClass.Process();
            if (process)
            {
                // Do this
            }
            else
            {
                // raise new Exception
            }
        }
        catch (SqlException sqlEx)
        {
            WriteToErrorLogger.Error(ex);
        }
        catch(Exception ex){
            WriteToErrorLogger.Error(ex);
        }       
    }
}

孩子

public class Child
{
    public bool Process()
    {
            // Do something and save to Database       
    }
}

如果你想有条件地这样做,你可以这样改变孩子

public class Child
{
    public bool Process(bool rethrow = false)
    {
        try{
            // Do something and save to Database
        }
        catch (SqlException sqlEx)
        {
            if(rethrow) throw;
            // log exception
            return false;
        }
        catch (Exception ex)
        {
            if(rethrow) throw
            // log exception
            return false;
        }       
    }
}

【讨论】:

  • 感谢@Athanasios 的建议。如果我采用第一个建议,那么我如何知道哪个 Child 类引发了异常,即如果我想记录哪个类引发的详细异常?
  • 有异常对象的Source属性。由于SqlException 和每个异常都继承自Exception,因此它在每个catch 子句中都可用。
  • 谢谢@Athanasios,我会接受这个答案
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多