可以尝试/捕获一些东西只是为了检查是否抛出异常?

时间:2010-09-10 11:04:51

标签: java exception

尝试使用无用的东西是一种好方法,只是为了查看此代码是否抛出了特定的异常? 抛出异常时我想做点什么,否则什么也没做。

try {  
    new BigDecimal("some string"); // This do nothing because the instance is ignored  
} catch (NumberFormatException e) {  
    return false; // OK, the string wasn't a well-formed decimal  
}  
return true;

要测试的前提条件太多,构造函数BigDecimal()总是检查它们,所以这似乎是最简单的方法。

10 个答案:

答案 0 :(得分:49)

一般来说,应该避免这种做法。但由于没有实用方法isValidBigDecimal(..),所以就是这样。

正如Peter Tillemans在评论中指出的那样,将此代码放在名为isValidBigDecimal(..)的实用程序方法中。因此,您的代码将无法确定有效性的方式,您甚至可以稍后切换到另一种方法。

BorisPavlović建议选择使用第三方库(commons-lang)进行检查。还有一个有用的方法,我需要验证数字时使用它 - NumberUtils.isNumber(..)

答案 1 :(得分:30)

如果你不喜欢这样的方法,请尝试使用BigDecimalValidator中的Apache Commons Validator。如果输入无效String,则会返回null

答案 2 :(得分:6)

这样做没有错;毕竟,某种其他语言的支持者喜欢说“道歉比要求许可更容易”,也就是说,等待某些事情失败并处理它比避免完全失败更容易。在这种情况下,由于没有其他选择,绝对可以选择。

答案 3 :(得分:5)

性能可能不是很好,语法冗长,但代码非常精确,它的功能。检查和使用之间没有重复,这一直是一个大问题。

(注意,这种特殊类型的字符串转换实际上是用于调试和内部配置。它不处理语言环境和其他面向人的考虑。文件格式和有线协议的使用引入了对表示的强烈依赖性班级使用。)

答案 4 :(得分:4)

有两种已知方法可以“检查”前提条件。

LBYL:在你跳跃之前先看看

此编码样式在进行调用或查找之前显式测试前置条件。这种风格与EAFP方法形成对比,其特点是存在许多if语句。

EAFP:比获得许可更容易请求宽恕。

这种常见的编码风格假设存在有效的密钥或属性,并且如果假设证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。

)共有的LBYL风格形成对比

对于有打字的语言,EAFP总是一个好主意。

这显然取决于你想做什么......如果你不确定要操纵的对象的类型,请使用EAFP。

答案 5 :(得分:1)

是的,这肯定与实用程序员关于“异常情况例外”概念的争论,但你认识到你正在做的事情,所以没有问题IMO

答案 6 :(得分:1)

评论kriss的回答: 我没有看到“精湛的内存泄漏”。没有引用创建的BigDecimal。只要此方法完成,并且我们超出范围,该对象就有资格进行垃圾回收。

当我们保存不再需要的引用时会发生内存泄漏,因此无法对对象进行垃圾回收。

答案 7 :(得分:1)

Try / Catch块永远不应该用于逻辑。

答案 8 :(得分:0)

当然,为什么不呢。我们这样做是为了检查客户指定的电子邮件地址是否格式正确:

try
{
    MailMessage m = new MailMessage(from, to, subject, body);
    return true;
}
catch(SmtpFailedRecipientsException ex)
{
    return false;
}

现在,人们可能会争论结构的性能或适当性,但他们忘记了简单性的权衡:

  • 上面的代码将捕获.NET接受的EXACT数据格式。任何解析过电子邮件地址的人都知道,对于被认为格式正确的电子邮件地址结构存在很多差异。此代码保证以.NET喜欢的方式验证电子邮件地址结构,而不是我认为应该如此。
  • 异常捕获多个用例,而不仅仅是基本数据结构的正确性。它将验证CC,BCC和TO字段中的多个用户,这些用户开始变得难以处理手写代码。

正如其他人在上面讨论的那样,这段代码最好被抽象为一个单独的实用程序类,而不是与主代码混合使用。

答案 9 :(得分:0)

在JVM的时间和资源方面,你必须考虑构造Exception对象是昂贵的,因为它必须构建strack跟踪。

所以你提出的建议是解决问题的一种简单但耗费资源的方法。

这个解决方案是否可接受,取决于您将给予此功能的用途以及您的效率要求。