在catch块中继续设置值的不良做法?

时间:2015-03-10 15:53:12

标签: c# exception-handling try-catch

我在我的代码中使用了类似的内容:

//some code that gets the group, etc.

Point3d rotationPoint;
try
{
    rotationPoint = GetRotationPoint(group) // Throws NoDataFoundException
}
catch(NoDataFoundException)
{
    rotationPoint = RequestRotationPoint(); // Let user pick the rotation point instead
}

//...and then simply continue the method

这种方法的原因是我无法检查rotationPoint是否为null,因为它是struct。 会有替代方案吗?

2 个答案:

答案 0 :(得分:3)

这是一种不好的做法,但实际上这是因为您使用Exceptions来处理系统中的逻辑,而不是您正在重复类似的操作。例外应该是Exceptional,因为你并没有真正期待它们,所以你会很好地呈现给用户并尝试继续或失败。

在这种情况下,您真正​​想要做的是TryParse方法:

 Point3d rotationPoint;
 if(GetRotationPoint(group, out rotationPoint) == false)
 {
    rotationPoint = RequestRotationPoint();
 }

修改

我应该补充一点,Exception是做这种事情的不良做法的原因是因为构造和抛出异常是一项昂贵的操作,这可能会导致代码中的性能瓶颈。通常情况下,这不是你需要担心的事情,但有时它是 - 如果你已经开始建立这条道路,那么很难从中备份。

答案 1 :(得分:3)

当您无法控制GetRotationPoint API时,这是一种可接受的方法。当您拥有API时,重新构建“dictionary style”会让您完全避免使用例外:

Point3d rotationPoint;
if (!TryGetRotationPoint(group, out rotationPoint)) {
    rotationPoint = RequestRotationPoint(); 
}