用测试替换异常
问题
您在一个简单的测试就可以完成工作的地方抛出异常?
解决方案
将异常替换为条件测试。
之前
double getValueForPeriod(int牙周数){尝试{返回值[牙周数];} catch (ArrayIndexOutOfBoundsException e){返回0;}}
后
double getValueForPeriod(int periodNumber) {if (periodNumber >= values.length){返回0;}返回值[periodNumber];}
之前
double GetValueForPeriod(int牙周数){尝试{返回值[牙周数];} catch (IndexOutOfRangeException e){返回0;}}
后
double GetValueForPeriod(int periodNumber) {if (periodNumber >= values.Length){返回0;}返回值[periodNumber];}
之前
函数getValueForPeriod($periodNumber) {try{返回$this->值[$periodNumber];} catch (ArrayIndexOutOfBoundsException $e){返回0;}}
后
函数getValueForPeriod($periodNumber) {if ($periodNumber >= count($this->values)){返回0;}返回$this->values[$periodNumber];}
之前
def getValueForPeriod(牙周数):try:返回值[牙周数]except IndexError:返回0
后
def getValueForPeriod(self,牙周数):if牙周数>= len(self.values):返回0返回self.values[牙周数]
之前
getValueForPeriod(牙周数:number): number{尝试{返回值[牙周数];} catch (ArrayIndexOutOfBoundsException e){返回0;}}
后
getValueForPeriod(periodNumber: number): number {if (periodNumber >= values.length){返回0;}返回值[periodNumber];}
为什么重构
异常应用于处理与意外错误相关的不规则行为。它们不应该作为测试的替代品。如果可以通过简单地在运行前验证条件来避免异常,那么就这样做。应该为实际错误保留异常。
例如,你进入了一个雷区并触发了一个地雷,导致了一个异常;这个异常被成功地处理了,你被空运到雷区之外的安全地带。但你本可以通过阅读雷区前的警告标志来避免这一切。
好处
- 简单的条件有时候比异常处理代码更明显。
如何重构
为边缘情况创建一个条件,并将其移动到try/catch块之前。
将代码从
抓
部分的内部。在
抓
节中,放置用于抛出常见的未命名异常的代码并运行所有测试。如果在测试期间没有抛出异常,则删除
试一试
/抓
操作符。