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

C# 定义和捕获自定义类型的新自定义异常,c#,C#,我为测试场景创建了以下异常: class EvaluationException : Exception { public PrettyError ExceptionDetails { get; } public EvaluationException(PrettyError exceptionDetails) { this.ExceptionDetails = exceptionDetails;

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

    class EvaluationException : Exception
    {
        public PrettyError ExceptionDetails { get; }
        public EvaluationException(PrettyError exceptionDetails)
        {
            this.ExceptionDetails = exceptionDetails;
        }
    }
我想用下面的挡块

catch (Exception e)
{
    if(e is EvaluationException)
    {
        e.ExceptionDetails //do stuff;
    }
}
但是
e.ExceptionDetails
不包含ExceptionDetails的定义。我已尝试将la
(EvaluationException)e
e=e强制转换为EvaluationException
,但仍然无法访问为自定义异常声明的新类属性


如何执行此操作?

由于e已属于类型异常,因此强制转换无法工作。如果您分配给一个新变量,它将起作用

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

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

具体问题

e
仍然是错误的类型。执行此操作时:

if(e is EvaluationException)
{
    e.ExceptionDetails //do stuff;
}
实际上,您并没有修改
e
的类型。它仍然是一个
异常
,它确实没有该属性。为了访问该属性,您需要在读取时将
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
块,这样您的代码就可以专注于处理异常,而不是在试图确定异常时把自己弄得一团糟。

是否改用
catch(EvaluationException e)
<代码>((EvaluationException e).ExceptionDetails)应该可以运行。还有其他类型的异常可以抛出,所以我希望在顶层尽可能保持它的通用性。@Reed如果您还想捕获其他类型的异常,那就为它们设置一个单独的捕获块。那么在它们自己的块中捕获这些异常?您可以强制转换,但需要将其分配给不同类型的变量
e=e作为EvaluationException
如果它不是
EvaluationException
的实例,则只将
null
分配给
e
var ee=e as evaluation exception
将起作用。我想说@David的代码退一步将是最好的做法。我完全同意你的答案,但是,如果你没有看到,在C#7.0中,你可以使用模式匹配来代替强制转换或使用
as
。例如:
if(e是EvaluationException EvaluationException)
,稍微简化了逻辑。当然,这在这里并不合适,只是因为已经有专门用于处理异常的语言结构。@JohnH:我确实没有看到过。我肯定会在我正在编写的一些代码中检查它,看看它是否能让事情变得更干净。谢谢值得一提的是,如果使用C#7,您可以执行
if(e是EvaluationException ex)
,然后可以在if块中使用ex。对不起,重复了。显然,在我打字的时候,这已经被评论过了。