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。对不起,重复了。显然,在我打字的时候,这已经被评论过了。