首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RuntimeException

使用RuntimeException
EN

Stack Overflow用户
提问于 2013-11-21 21:29:08
回答 3查看 68关注 0票数 1

假设我希望对代码中的特定“情况”有一个未检查的异常--例如,当队列已满75%时。我所需要的只是一个例外,说“队列已达到75%的阈值”。

其中最明显的是(?)这样做的方法是

代码语言:javascript
复制
public class QueueT extends RuntimeException {
  QueueT () {
      super("queue has reached the 75% threshold");
  }
}

对于这个异常,我所拥有的全部和唯一的用途是

代码语言:javascript
复制
  try {
     // some stuff here
     throw new QueueT();
     } catch (QueueT e) {
        System.out.print("<<"+e+">>");
       }

我想知道的是

而不是下面。回想一下:我没有其他用途--不需要那些、Throwable或其他任何方法。

代码语言:javascript
复制
  try {
     // some stuff here
     throw new RuntimeException("queue has reached the 75% threshold");
     } catch (RuntimeException e) {
          System.out.print("<<"+e+">>");
        }

据我所见,我唯一的收获是在不干扰字符串属性的情况下调用构造函数。

这甚至是有益的--我可以很容易地参数化我将抛出异常的阈值:

代码语言:javascript
复制
 // setting the percentage value here
 throw new RuntimeException("queue has reached the" + percentage + "% threshold");

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-21 21:33:54

你得到的结果是在第一个例子中,

代码语言:javascript
复制
try {
   // some stuff here
   throw new QueueT();
} catch (RuntimeException e) {
   System.out.print("<<"+e+">>");
}

如果您将catch (RuntimeException e)替换为catch (QueueTe)

代码语言:javascript
复制
try {
   // some stuff here
   throw new QueueT();
} catch (QueueTe e) {
   System.out.print("<<"+e+">>");
}

在这里,您可以非常准确地说出要捕获的错误类型。否则,您可能会有代码的另一部分抛出运行时异常,处理几乎满队列的代码可能试图应用于与队列完全无关的异常。如果只捕获QueueT异常,则可以更好、更准确地应用代码。

票数 0
EN

Stack Overflow用户

发布于 2013-11-21 21:48:19

假设我希望对代码中的特定“情况”有一个未检查的异常--例如,当队列已满75%时。我所需要的只是一个例外,说“队列已达到75%的阈值”。

对于例外情况,这是一个很糟糕的例子。异常不是用于业务逻辑,而是用于特殊情况。这似乎是一个预期的场景,更像是一个通知而不是一个例外。你认为一个发现这一例外的人会有什么反应?就无视它?如果是,例外的目的是什么?而且,以这种方式使用异常根本不具有性能,因为它必须填充堆栈跟踪,重复这样做会使您的性能非常糟糕。

至于您的另一个问题,使用您自己的运行时异常与使用RuntimeException的好处是,您现在有了自己的异常,这在语义上是(希望)合适的,您可以适当地抛出或处理该异常。仅仅使用RuntimeException本身并不能提供那么多信息。

票数 2
EN

Stack Overflow用户

发布于 2013-11-21 21:34:24

如果稍微更改一下catch子句,那么第一个调用的兴趣很容易理解:

代码语言:javascript
复制
 try {
// some stuff here
throw new QueueT();
} catch (QueueT e) {
   System.out.print("<<"+e+">>");
}

因此,您将只捕获QueueT的实例,而不是潜在的其他运行时,比如null指针,这类异常最好允许传播到入口点,以便检测到某些编码或设计问题。实际上,在您首先编写的代码中,您将无法将预期的完整队列情况与真正的运行时错误区分开来。您将丢失错误信息,程序将表现为队列已满,而不是

一个好的实践是永远不要捕获异常超级类型,既不是运行时,也不是可抛出的(最坏的)。

另一个是用异常后缀: QueueAboutFullException命名异常。

另一种方法是,如果捕获异常的位置与抛出异常的位置大致相同,则不使用异常编程。喜欢简单的if,因为它的成本比中断低得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20132289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档