何时应该使用自定义异常?

4

我想知道什么时候是最好的时间来使用自定义异常?

代码

public void myMethod() throws MyCustomizedException {

   try{
      ...
   }catch(IOException e){
     logger.log(e);
   }
}

caller.myMethod();

https://dev59.com/L1zUa4cB1Zd3GeqP6cZW - PSR
7个回答

1
答案真的取决于具体情况。定制化的异常是针对特定项目的。举个例子,假设我正在开发一个仓储产品。
public void addProductToWarehouse() throws WareHouseCapacityExceedException{
 if(warehouse.isFilled()){
     throw new WareHouseCapacityExceedException("Some custom message");
  }
  // proceed, warehouse is free.
}

0

创建自定义异常的最常见原因是,如果您正在构建自己的Java库集,并且除了现有异常中的属性和方法之外,还想包含其他属性和方法,则需要创建自定义异常。


0

这取决于你在哪里实现它。我会说几乎所有的时间都需要!

如果出现问题,您希望为应用程序抛出不同类型的错误。在这种情况下,您将实现自定义异常。

例如

在您的代码中,您正在验证用户输入数据,如果未输入有效数据,则会抛出InvalidInputException(仅作为示例)

您不能总是抛出Java中预定义的异常,因为这些异常是有原因定义的。 例如NullPointerException,当您尝试取消引用空引用时,将抛出此异常。


0
在创建自定义异常之前,首先应查看标准库中包含的异常并重用它们,如果其目的与您的相同(或非常相似)。
请参阅ExceptionRuntimeException的已知直接子类。一些Exception还有许多专门的子类,例如查看IllegalArgumentExceptionIllegalStateException的直接子类。
例如,如果您的方法需要一个不能为null的参数,请使用{{link1:NullPointerException}}。如果该参数具有有效范围并且您不接受其他值,请使用{{link2:IllegalArgumentException}}。
如果标准库(或您使用的库)中没有现有的异常用于特定目的,或者您想要抛出的异常应与从您的方法调用的代码和方法可能抛出的异常有所区别,则创建自定义Exception

0

关于创建异常类的Oracle Java教程如下所述:

如果您回答“是”以下任何一个问题,那么您应该编写自己的异常类;否则,您可能可以使用其他人的异常类。

  • 您需要一个在Java平台中没有表示的异常类型吗?
  • 如果用户能够区分您的异常和其他供应商编写的类抛出的异常,这是否有助于用户?
  • 您的代码是否会抛出多个相关的异常?
  • 如果您使用其他人的异常,用户是否可以访问这些异常?类似的问题是,您的包是否独立且自包含?

此外,我想补充一点,如果当前范围没有足够的信息有效地处理异常,通常应该抛出异常。当您抛出异常时,将其传递到不同范围以进行处理。


0

一个使用案例是当您想以一般化的方式处理多个异常时。例如:假设您希望以一般方式(在屏幕上为所有3个异常显示错误)处理SQLExceptionConnctionExceptionSomeOtherException,那么只需将该异常包装在您的自定义异常中,并让父级以一般方式处理它。这可以防止使用多个catch块来混淆代码以处理常见的异常。


0
我认为当你想要准确知道出了什么问题时,使用自定义异常是比较好的选择。如果是你自己定义的异常,你就知道它没有其他可能的原因,而不像一些通用的或已存在的异常,可能是由于与问题无关的原因而被抛出的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接