我为测试场景创建了以下异常:
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)e
和e = e as EvaluationException
,但仍然无法访问为自定义异常声明的新类属性。
我该怎么做?
答案 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
块,因此您的代码可以专注于处理异常,而不会试图确定异常而使自己混乱。