我有一个代码,我需要声明一个“var”变量,因为类型会根据请求而改变。此声明必须在try块内进行以捕获任何异常:
try
{
var calc = (Type1)obj;
var results = calc.Function();
}
catch
{
var calc = (Type2)obj;
var results = calc.Function();
}
finally
{
return results;
}
现在问题是,“结果”不起作用,因为范围在try catch块之外结束。我无法在try try之外声明var,因为我必须检查类型转换并相应地更改类型。
Type1,Type2是不同的接口,obj又是“var”,可以有不同的类型。
我甚至无法将try块外的var启动为null。我该如何解决这个问题?
答案 0 :(得分:1)
有两个回报而不是一个:
public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
同时强>
在尝试强制转换之前,您应该检查obj是否为Type1类型,以避免异常。 像这样:
$this->registerJs('js/myjsfile.js', $this::POS_HEAD);
<强>此外强> 因为你必须有两个返回类型必须符合的返回类型,你可能会这样做(但不建议这样做):
var results = //determine the result type here
try
{
var calc = (Type1)obj;
return calc.Function();
}
catch
{
var calc = (Type2)obj;
return calc.Function();
}
答案 1 :(得分:0)
从清洁代码角度来看,最佳方法是定义Type1
和type2
实现的通用接口:
interface IFoo
{
MyType Function();
}
现在您无需切换类型,可以轻松定义result
try/catch
,让finally
正确处理:
MyType result = null;
try
{
IFoo foo = obj as IFoo;
results = foo.Function();
}
catch
{
...
}
finally
{
return results;
}