2010-07-15 96 views
1

使用try-catch块时,将catch块留空是否总是一种糟糕的编程技巧?捕捉异常,是否和不要

在我预计会发生异常的情况下,例如,我正在从文件读取10个值并将每个值转换为字符串。有可能这10个值中的一个可能为空,但我不想在这一点停止执行,而是继续(明显使用try catch)

我的一个蹩脚的例子尝试:

String _text = textReader.ReadLine(); //Assuming this RETURNS a NULL value 
try { 
     String _check = _text.ToString(); 
     //Do something with _check, but it should not be NULL 
    } 
catch (Exception) 
    { //Do Nothing } 

在这一点上,当我抓到一个例外:
1.我不想记录此。因为我期待一个错误的价值。
2.我不想重新向调用堆栈抛出异常。
3.我想继续执行我的执行
在这些情况下,是否可以接受为空?或者这是一个完整的NO-NO,有更好的方法来处理这个问题吗?

我认为这可以是一个社区维基,因为它也处理编程技术。
- 伊瓦尔

+0

可能重复:http://stackoverflow.com/questions/2737328/why-should-i-not-wrap-every-block-in-try-catch – Konrad 2010-07-15 18:55:20

+0

@Konrad:我不认为所以。你列出的可能重复是关于try/catch块是否应该正常使用;这是一个空的catch块在某种情况下是否有意义。 – 2010-07-15 19:13:30

回答

4

我假设你的意思是

_text.ToString() 

和你担心的情况下_text可能

我不喜欢你在这种情况下使用异常。让自己置身于需要维护此代码的人的头脑中。他们看到:

catch (Exception) { } 

他们真的可以推断出所有这一切正在捕获空情况吗?他们必须考虑可能抛出的其他异常。这至少会引起维护者头脑中的不确定性。

为什么你能不能代码:

if (_text != null) { 
     String _check = _nullValue.ToString(); 
} 

这究竟说你是什么意思。

但是,进一步说,获取NULL的值是什么意思?您正在读取一个可能包含10个值的文件。我猜测可能是空白行给你一个null?

如果你有什么打算:

1 
2 
<blank line> 
4 
... 
10 

所以这是9个良好的价值观和一个空行。如果你得到10个好的价值观和一条空白的线,你会做什么? 11个好价值? 11个很好的值和一个空行?

我的观点是,默默地忽略用户输入中的怪异往往是一个坏主意。上面的一些情况实际上很可能是拼写错误。在某些情况下,警告您可能对用户非常有帮助。这意味着,如果不是实际的即时错误日志,那么输入中的大多数情况可能至少需要某种类型的计数。

你可能,例如,在年底

Your file contained 13 lines, two lines were blank. We processed 10 valid values and ignored one. 

在调试的目的,你可能有错误的路径跟踪语句非常leasyt发出的消息。

摘要:完全忽略异常很少是正确的做法。

+0

+1:正如他所说。我还会补充一句:如果你绝对肯定地想要吞下一个异常,至少应该提供一种可选的方式来记录它。这样,如果代码行为异常,您有机会在运行时验证您确实在吞咽您期望得到的异常,而不是其他东西。 – Lars 2010-07-15 19:27:51

0

如果预计它不是特例。这是否很好地利用了异常?在尝试做某事之前测试一个空值可能更合适。

if(_text != null) 
    // do something 
0

我喜欢的最佳论据是代码将变得高度不可维护。我的目标是让我的代码尽可能容易理解。 有了上面的建议,我有一个三元运营商的军队(我个人最喜欢的大if-else块)。
而代码绝对看起来更好!而且我认为除非尝试抓住有充分的文件记录,否则我自己并不认为有空的抓住言论的好理由。

谢谢你们!
-Ivar