在方法开始和结束时进行错误处理的优缺点是什么?
本文关键字:处理 错误 优缺点 是什么 开始 方法 结束 | 更新日期: 2023-09-27 18:01:16
以我的程序员经验,我有混合错误处理所有可能的方式…我创造了我的个人风格。
然而,我想听到你认为在方法开始和结束时处理错误的优缺点。
开头处理:
public String GenerateSomeStringData(String data, int value)
{
if (data == null)
throw new ArgumentNullException("data");
if (value <= 0)
throw new ArgumentException("value must be greater than zero");
int dataValue;
if (!int.TryParse(data, out dataValue))
throw new InvalidOperationException("data does not contain an integer");
return dataValue * 4 + value / 12;
}
结尾的处理:(同样的例子)
public String GenerateSomeStringData(String data, int value)
{
if (data != null)
{
if (value > 0)
{
int dataValue;
if (int.TryParse(data, out dataValue))
{
return dataValue * 4 + value / 12;
}
else
throw new InvalidOperationException("data does not contain an integer");
}
else
throw new ArgumentException("value must be greater than zero");
}
else
throw new ArgumentNullException("data");
}
在决定如何处理这个问题时,您使用什么标准?可读性、可维护性、简洁性?
输入的有效性应该是执行方法的先决条件-因此,我将(并且确实)总是首先执行错误处理。
这有以下优点:
-
对于人来说更容易解析:然后,首先验证前提条件执行逻辑(通常
-
明确关注点之间的分离错误处理和执行逻辑
验证逻辑没有"撒入"执行逻辑中
正如在注释中提到的,你必须区分违反先决条件并触发错误条件(如抛出异常)的无效输入和构成边缘条件(即需要一些特殊逻辑来处理)的有效输入。后一种情况我将在断言前提条件之后,在方法的执行逻辑开始时单独处理。
正如其他人提到的,我会在执行方法的任何核心逻辑之前检查输入的有效性。这不仅在逻辑上有意义,而且还减少了代码的缩进,保证了if{}语句不会太长,以至于无法在一个屏幕上看到else
第一种方法要好得多。
它帮助您将所有验证保存在一个地方。您甚至可以编写一个泛型函数来处理这种类型的验证。
显然可读性更强。在开始的时候,您已经完成了所有的验证,因此您可以开始执行实际的逻辑。
如果你的代码跨度稍微大一点,就很难追踪If循环的右括号
我的意见是:先做错误条件检查,为别人明确定义什么是可以的方法,什么是不可以的