这是更有效/更好的代码。使用是对象,然后unbox如果它是那种类型的对象?或者使用try catch
WizardStep parentWizardStep;
try
{
parentWizardStep = (WizardStep)this.Parent;
}
catch
{
throw new Exception("Unable to cast parent control to this type.");
}
或者这个:
WizardStep parentWizardStep;
if(this.Parent is WizardStep)
{
parentWizardStep= (WizardStep)this.Parent;
}
else
{
throw new Exception("Unable to cast parent control to this type.");
}
答案 0 :(得分:17)
如果您需要在演员表无效时抛出异常,为什么还要抓住正常的InvalidCastException
?只需投射它就没有额外的代码:
WizardStep parentWizardStep = (WizardStep) Parent;
您目前正在替换一个异常,该异常在其类型(InvalidCastException
- 至少,所以您希望)中传达其含义,只有Exception
- 您为什么要丢失信息?
如果不属于正确类型的相关值的错误,上面肯定是我经常做的。否则,使用as
运算符和空检查:
WizardStep parentWizardStep = Parent as WizardStep;
if (parentWizardStep == null)
{
// It wasn't a WizardStep. Handle appropriately
}
else
{
// Use the WizardStep however you want
}
但无论如何,做一些你知道可能引发异常的东西是非常可怕的,并且很容易测试以避免异常,但选择抓住它。效率会很差,但更重要的是它只是不恰当地使用异常。除了其他任何东西,你现在正在捕捉所有异常......如果抓取this.Parent
会引发一些完全不同的异常呢?它可能与铸造无关。除非您尝试实现某些顶级“全能”处理程序(例如,中止服务器请求),否则只捕获特定的异常。
答案 1 :(得分:5)
使用代替更有效:
WizardStep parentWizardStep = this.Parent as WizardStep;
if(parentWizardStep == null)
{
// This isn't the right type
throw new ApplicationException("Your exception here.");
}
// Use parentWizardStep here....