1

假设有这样的情况:

statement 1;
statement 2;
statement 3;
statement 4;
statement 5;
statement 6;
statement 7;
statement 8;
statement 9;
statement 10;

这些声明中的任何一个都被怀疑引发了Exception. 所以我把它们放在一个try-catch块里。

try{
    statement 1;
    statement 2;
    statement 3;
    statement 4;
    statement 5;
    statement 6;
    statement 7;
    statement 8;
    statement 9;
    statement 10;
}catch(Exception e){
    e.printStackTrace();
}

现在,假设要完成我的计算,无论如何我都需要处理所有这 10 条语句。我该如何处理这种情况?

例如,假设我有 10String秒。NullPointerException当用户决定将该字段留空时,他们中的任何一个都可能会抛出 a (比如在表单上不适用的情况)。如果我要开发整个项目,我可以首先检查null并返回相应的值进行处理。但假设我只需要开发这个模块来处理数据。

我可以进行个别if检查以检查哪个String为空,在处理过程中忽略它的值,然后继续。但是如果我有n多个Strings,引入n if语句就不会很整洁。会吗?

try catch即使发生,我也可以拥有个人并继续处理Exception。但话又说回来,不会整洁。

我可以分析堆栈跟踪并获取行号并跳转到下一行并继续处理。(我可以吗?我不确定。从捕获跳回到尝试?我相信不可能,但仍然把它写下来作为一种可能性)。

但这些方法似乎并不合适和正确。

有没有更好更简单的方法来处理这种情况?我刚刚举了一个例子,String要处理的数据可以是任何东西,并且可以生成任何Exception.

再次重复我的问题:有没有办法完成对方法或过程的评估,无论其中产生多少异常?

这个问题可能是重复的(虽然我没有找到),或者可能措辞不当。随意编辑它(或建议编辑),但保持主要思想仍然集中。

4

3 回答 3

4

我可以进行单独的 if 检查以检查哪个字符串为空,在处理中忽略它的值,然后继续。但是,如果我有 n 个字符串,那么引入 n 个 if 语句就不会很整洁。会吗?

您是否对每个字符串都做同样的事情,您应该将“检查并选择性地做某事”行为提取到一个方法中。

您绝对不应该在您知道可以合法地为空的空引用上调用方法。NullPointerException应该总是在某处指出一个错误(或者你不应该得到空引用,或者如果这是合法的,你应该在对它做任何事情之前检查它)。

如果你的方法是做 10 件独立的事情,每件事情都可能失败,那么它可能太大而无法开始。听起来它们是独立的操作(否则在操作 1 失败后您无法执行操作 2)因此将每个操作放入带有 try/catch 块的单独方法中,并从您的顶级方法中调用它们。

不过,从根本上来说,这感觉像是一种代码气味——面对异常,愉快地继续执行一系列步骤很少是一个好主意,而且几乎可以肯定不仅仅是通过捕获Exception. 您应该仔细考虑这是否真的是您想要的设计。

语言中绝对没有任何东西可以让您更轻松 - 正是因为它几乎总是做错事。

于 2012-06-23T08:17:41.653 回答
3

也许您可以将字符串/语句放在一个数组中,并将 Try Catch 块放在一个循环中,该循环遍历数组元素。

像这样的东西:

for (Statement statement: statements) {
  try{
    statement;
  }catch(Exception e){
    e.printStackTrace();
  }
}
于 2012-06-23T08:27:47.623 回答
2

我赞同 Jon Skeet 所说的代码味道(违反单一责任原则)。加上:

如果数据验证可以防止这些异常,那么您还可以考虑编写通用验证器(或基于类型),然后在执行操作之前调用验证器(仅在数据验证成功时才执行操作)。

使用此设置,考虑到我的假设是正确的,您可以在验证失败时记录一些内容,也可以在循环中执行所有这 10 条语句(因为代码路径相似)

foreach (var statement in statements)
{
       if (statement.IsDataValid()) 
       {
           statement.Execute();
       }
       else
       {
           // Log stuff or handle appropriately
       }
}

只是给出方向,因为我没有太多关于您的代码或数据的信息。

于 2012-06-23T08:27:01.043 回答