一个相当简短的问题。
让我们使用这段代码:
public ref class Foo
{
private:
System::Collections::Generic::Dictionary<System::String ^,System::String ^> ^ aDictionary;
public:
property System::String ^ SomeIndexedProperty[System::String ^]
{
public: System::String ^ get(System::String ^ index)
{
return aDictionary[index];
}
}
public:
Foo(void)
{
aDictionary = gcnew System::Collections::Generic::Dictionary<System::String ^,System::String ^>();
}
};
用if语句(if( aDictionary->ContainsKey(index) )
)包围/预先检查返回会不会更好?或者用try..catch块包围return语句会更好吗?
在两种情况下,当失败时返回nullptr。
速度并非真正的问题。但只是一般性的“这样做更好”就足够了。
答案 0 :(得分:2)
我坚信,如果您合理地允许合法条件,您不应该发现异常来检测它。换句话说,使用if
语句。这类似于让数组上的所有循环都运行,直到你得到ArrayIndexOfBoundsException
并尝试将其捕获为遗忘。
在相关的说明中,属性可能有意义抛出KeyNotFoundException
而不是返回null
。调用者可能会使用此null
并尝试取消引用它,这会转移焦点并使查找错误变得更加困难。
答案 1 :(得分:1)
Givent你所描述的情况,我认为这仅取决于你的偏好。 无论如何,当失败的条件是确定性的,你可以预料到它时,它总是一个更好的解决方案,不使用try..catch块,只留下非确定性和不可预测的错误。
所有反对异常的参数而不是“if”块,只是关于性能(速度,内存,堆栈,ecc ......)并且是有效的。实际上,当你需要一个完全无异常的方法,并且不关心null返回值的原因时,只需将你的5行try..catch块,并忘掉它! ;)