2011-04-13 80 views
0

我在.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块。 在这种情况下有什么更好?

+2

你不应该_return_例外,你应该扔** **他们。 – 2011-04-13 08:44:43

+0

是的...我的错误.. :) – Yanshof 2011-04-13 08:47:08

回答

1

你在这里使用的模式是错误的,因为它返回一个异常而不是抛出它。我认为这是一个错误的问题,否则你的对象将不得不以某种方式与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第三种方法,因为:

  • 它给出的用于检查参数的有效性代码明确分开,并执行实际工作
  • 它使更细粒度的检查,而不是一个代码单一检查基本上告诉我,如果没有指定什么是错误的,它可以在一个方法的开始,并且可以隐藏在一个区域中,所以当我检查方法的核心性时,我不需要关注它正确的代码。
  • 可以很容易地添加或更改罚球断言,登录陈述或任何实际需要
1

这取决于参数有多大可能是无效的。无效论据例外预计

A try...catch块会导致更干净的代码和更快的正常情况下执行,但错误情况会执行得更慢。

因此,如果此方法被多次调用无效数据,这将是您的应用程序中潜在的慢点,并使您的表单中的代码效率稍高。

+0

我看到你想说的 - 但如果即时通讯使用try..catch块=>参数的检查需要在下一个级别 - 并抛出异常需要在方法'Method1' – Yanshof 2011-04-13 11:18:20

+0

@Yanshof - 在技术上,但另一种方法是让代码失败 - 而不是检查null和抛出'ArgumentNullException'说 - 你让解引用失败并陷阱。 – ChrisF 2011-04-13 11:22:43