定义和捕获自定义类型的新自定义异常

时间:2018-09-11 20:01:24

标签: c#

我为测试场景创建了以下异常:

    class EvaluationException : Exception
    {
        public PrettyError ExceptionDetails { get; }
        public EvaluationException(PrettyError exceptionDetails)
        {
            this.ExceptionDetails = exceptionDetails;
        }
    }

我想使用以下catch块

catch (Exception e)
{
    if(e is EvaluationException)
    {
        e.ExceptionDetails //do stuff;
    }
}

但是e.ExceptionDetails不包含ExceptionDetails的定义。我尝试转换la (EvaluationException)ee = e as EvaluationException,但仍然无法访问为自定义异常声明的新类属性。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

强制转换不起作用,因为e已经是Exception类型。如果您分配一个新变量,它将起作用。

您还可以捕获特定的异常类型以使您的生活更轻松,例如:

catch (EvaluationException evalex)
{
    //do stuff
}
catch (Exception ex)
{
  // do other stuff
}

答案 1 :(得分:4)

特定问题

e仍然是错误的类型。当您这样做时:

if(e is EvaluationException)
{
    e.ExceptionDetails //do stuff;
}

您实际上并没有在修改e的类型。它仍然是Exception,实际上没有该属性。为了访问该属性,您需要在读取e时将其解释为该类型:

if(e is EvaluationException)
{
    (e as EvaluationException).ExceptionDetails //do stuff;
}

或者也许:

if(e is EvaluationException)
{
    var ex = e as EvaluationException;
    ex.ExceptionDetails //do stuff;
}

退后一步

尽管如此,由于它位于catch块中,因此您可以更好地利用该工具(并得到更好的组织代码)以按类型分隔异常处理程序:

try
{
    //...
}
catch (EvaluationException e)
{
    // specific handling for this exception type
}
catch (Exception e)
{
    // catch-all for non-specific exceptions
}

您可以随意链接多个链接。这样,运行时就可以确定要使用哪个catch块,因此您的代码可以专注于处理异常,而不会试图确定异常而使自己混乱。