代码之家  ›  专栏  ›  技术社区  ›  Brad Parks

捕获异常、应做和不应做的

  •  1
  • Brad Parks  · 技术社区  · 6 年前

    在使用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。我不想在调用堆栈中重新抛出异常。
    三。我只想继续我的处决
    在这些情况下,是否可以将捕获物留空?或者这是一个完全不可能的问题,有更好的方法来解决这个问题?

    我想这可能是一个社区wiki,因为它还涉及编程技术。
    -伊瓦

    3 回复  |  直到 14 年前
        1
  •  4
  •   djna    14 年前

    我想你是说

     _text.ToString()
    

    你关心这个案子的时候 文字文字 可能是 无效的 ?

    我不喜欢你在这种情况下使用例外。请记住需要维护此代码的人。他们看到:

    catch (Exception) {  }
    

    他们真的能推断出这一切都在捕捉空的情况吗?他们必须考虑可能抛出的其他异常。至少这在维护人员的头脑中引起了不确定性。

    为什么你不能编码:

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

    这正好说明了你的意思。

    但更进一步,得到一个空值意味着什么?您正在读取的文件中可能有10个值。我猜也许空行给你一个空值?

    如果你得到:

     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.
    

    至少出于调试目的,错误路径中可能有跟踪语句。

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

        2
  •  0
  •   dsas    14 年前

    如果可以预料的话,这并不是特别的。这是一个很好的例外使用吗?在尝试做任何事情之前测试一个空值可能更合适。

    if(_text != null)
        // do something
    
        3
  •  0
  •   topgun_ivard    14 年前

    我最喜欢的理由是代码将变得高度不可维护。我的目标是使我的代码尽可能容易理解。 有了上面的建议,我有了一支由三元操作人员组成的军队(我个人最喜欢的是大型if-else模块)。
    代码看起来肯定更好!我认为,除非有很好的文档记录了try catch,否则我自己就看不到有空catch语句的好理由了。

    谢谢大家!!
    -伊瓦