检查参数,以避免try..catch块(?)
问题描述:
我在.svc文件检查参数,以避免try..catch块(?)
public SomeDTO Method1(byte[] bitmapAsByteArr, DTO1 dto1, DTO2 dto2)
{
if(bitmapAsByteArr!= null && bitmapAsByteArr.Length > 0 && dto1!= null && dto2 != null)
{
return new SomeDTO(bitmapAsByteArr,dto1,dto2,1,2,3,4);
}
else
{
throw new ArgumentNullException();
}
}
我徘徊,如果这种方式是更好地让他们在尝试这种方法的身体写了这个方法.. catch块。 在这种情况下有什么更好?
答
你在这里使用的模式是错误的,因为它返回一个异常而不是抛出它。我认为这是一个错误的问题,否则你的对象将不得不以某种方式与ArgumentNullException
类连接,这显然是错误的。
你可以做的是:
- 您的解决方案,我们检查的有效性所有参数,然后做的工作
if (are_all_arguments_ok)
{
//procedure code, possibly hundreds of lines
}
else
{
throw new SingleExceptionForAnyParameterIssues();
}
- 嵌入代码的try..catch
,像
try
{
//procedure code, possibly hundreds of lines
}
catch
{
//not really sure what we caught here
//could be a parameter problem, could be a code problem
throw new SingleExceptionForAnyParameterIssues();
}
- 在该方法的头检查参数
if (param1_is_null)
{
throw new ArgumentNullException("param1");
}
if (param1_is_invalid)
{
throw new ArgumentException("bad, bad param1","param1");
}
// other parameters are checked here
//procedure code, possibly hundreds of lines
I(obviuosly)prefere第三种方法,因为:
- 它给出的用于检查参数的有效性代码明确分开,并执行实际工作
- 它使更细粒度的检查,而不是一个代码单一检查基本上告诉我,如果没有指定什么是错误的,它可以在一个方法的开始,并且可以隐藏在一个区域中,所以当我检查方法的核心性时,我不需要关注它正确的代码。
- 可以很容易地添加或更改罚球断言,登录陈述或任何实际需要
答
这取决于参数有多大可能是无效的。无效论据例外或预计。
A try...catch
块会导致更干净的代码和更快的正常情况下执行,但错误情况会执行得更慢。
因此,如果此方法被多次调用无效数据,这将是您的应用程序中潜在的慢点,并使您的表单中的代码效率稍高。
你不应该_return_例外,你应该扔** **他们。 – 2011-04-13 08:44:43
是的...我的错误.. :) – Yanshof 2011-04-13 08:47:08