gpt4 book ai didi

language-agnostic - 在流程之前进行验证还是仅抛出异常会更好?

转载 作者:行者123 更新时间:2023-12-03 08:16:01 25 4
gpt4 key购买 nike

考虑以下代码:

x = Repo.GetX(13);
Services.Process(x);

我可以在处理x之前检查x是否为null,或者如果X为null并使用try/catch块,可以让Services.Process()引发异常。

哪种方法更好?

(或者我应该同时做这两种情况,只是在x从检索到处理的某种程度上变为null的异常(exception)情况下?)

最佳答案

如果您要在以下两者之间做出决定:

x = Repo.GetX(13);
try {
Services.Process(x);
} catch (NullPointerException) {
System.err.println('x is NULL');
}

要么
x = Repo.GetX(13);
if (x != NULL) {
Services.Process(x);
} else {
System.err.println('x is NULL');
}

然后要注意,它们并不意味着同一件事。第一个捕获 Process抛出的所有NullPointerException。第二个仅处理 x本身为NULL的情况-如果 Process执行 x.foo().bar(),而 x.foo()返回NULL,则不处理。

您应该根据可以处理的错误在两者之间做出决定。

Services.Process被记录为仅当 x为NULL的情况下抛出NullPointerException的情况下,因此(假设我们相信该文档)两者确实是同一件事,那么我将做第二件事。这样,如果文档在说谎,并且 Services.Process中存在一个错误,使它在其他情况下抛出,那么我们不会错误地处理/报告该异常,就像 x实际上为NULL一样。

因此,在两种情况下捕获并抑制异常:
  • 您知道是什么(某种事物)引起了该错误,并且您知道可以处理这种情况并继续执行。
  • 为了保护某些相当外部的代码级别(例如事件循环)免受程序或环境中的意外错误的影响。理想情况下,这应该导致大量的日志记录,因为系统无法完成您期望的操作(可能是由于资源不足或依赖关系未满足),或者某个地方的某人代码中存在错误。

  • 不要仅仅因为您知道一种可能导致异常的情况就可以捕获该异常,并且可以在由于其他原因而引发同一异常时处理该异常。我想你可以做:
    x = Repo.GetX(13);
    try {
    Services.Process(x);
    } catch (NullPointerException) {
    if (x == NULL) {
    System.err.println('x is NULL');
    } else {
    throw;
    }
    }

    但是在这种情况下,这似乎对我来说是不必要的冗长:因为我们可以预先检查 x是否为null,所以我们也可以这样做。但是,在某些情况下,您会捕获异常,因为无法或只是愚蠢地尝试提前预测是否会发生这种异常:
    String s = Rep.GetString(13);
    try {
    f = Float.parseFloat(s);
    System.out.println('is a number');
    } catch (NumberFormatException) {
    System.out.println('not a number');
    }

    我们可以在调用 s之前检查 parseFloat是否为有效数字,但是基本上可以完成两次相同的工作-检查字符串是否为有效浮点数与实际转换它几乎相同。因此,捕获此异常很​​有意义-我们知道它的含义,知道该怎么做,我们实际上无法阻止它的发生。

    (或者您可以使用DecimalFormat.parse,它根本不会抛出)

    关于language-agnostic - 在流程之前进行验证还是仅抛出异常会更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6016346/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com