Java 用于管理异常的类

Java 用于管理异常的类,java,methods,try-catch,short,Java,Methods,Try Catch,Short,有一个带有用于捕获异常的短方法的类好吗 class ContractUtils{ public static String getCode(Contract contract) throws MyException{ try{ return contract.getInfo().getCode(); //throws ContractException and LogicException }catch(Exception e){ throw new

有一个带有用于捕获异常的短方法的类好吗

class ContractUtils{
  public static String getCode(Contract contract) throws MyException{
    try{
      return contract.getInfo().getCode(); //throws ContractException and LogicException
    }catch(Exception e){
      throw new MyException("error during code reading:"+e.getMessage, e);
    }
  }
  //other methods like above...
}

在代码中单独捕获和处理异常总是更好的。不建议分配公共自定义异常

有关管理异常的最佳实践,请参阅此链接:


如果自定义异常为调用代码提供了额外的上下文或值,那么创建它们是非常有用的


您使用静态方法的方法是完全可以接受的。这里有一个很好的定义短静态方法的用例。

您的实用程序类
ContractUtil
引入了一个间接级别,只是为了将原始异常转换为另一个异常:

而不是直接呼叫:

 return contract.getInfo().getCode()
您现在正在编写更为人工的

 return ContractUtils.getCode(contract);
但是在某些情况下,此解决方案可能是合理的,例如:

你是 不允许抛出ContractException或LogicException,并且您经常调用此方法 好几次了


但是,如果您可以更改其签名,那么最好重新设计原始方法,只抛出
MyException

,将应用程序逻辑与错误处理分离以提高可读性

但不在实用程序类中,因为您可能会忘记使用它,直接完成它的任务,并且仍然需要自定义异常。如果这个逻辑使用得足够频繁,我会将它放在Contact类中(并将Contract.getInfo()设为私有)。另一个缺点是,它可能会导致实用程序类对其他类的实现细节过于了解(LoD-),可能会破坏封装,并由于依赖性较高而降低它们的可维护性


而且,您可能希望捕获特定的异常。

不要忘记在方法的SignatureEhhh中写入“throws”。当您能够有效地响应异常时,应尽快处理异常。通常情况下,这在一些随机实用程序方法中并不常见,而是在较低级别(在
contract.getInfo().getCode()
本身中)或更高级别(在可以生成有用错误消息的应用程序级别)。如果
contract.getInfo().getCode()呢
抛出例如
空点异常
算术异常
?在这些情况下,您肯定不想捕获并抛出一个
MyException
?不,只需将您的try/catch直接放在您的实际方法中(您有联系人并希望获取代码)。与使用“getCode(contract contract)”静态方法相比,使用try/catch更好地包围“contract.getCode()”。用例场景如下:我使用外部参与者提供的contract类,这些类为每个get方法抛出两种类型的自定义异常,我的想法是使用一个类来管理这些异常,并在新的自定义异常中放入有用的错误消息。在更高的级别上,我将捕获每个异常,并使用以下模式记录消息:“合同编辑期间出错:”+e.getMessage。因此,我期望的结果是这样的:“合同编辑期间出错:代码读取期间出错:值为空”。OP从未说明这些异常的管理程度。实际上,每个COTS和OSS库都会创建自定义异常。也,您链接到的答案被SO用户社区发现过于宽泛。它不经常调用,但我必须多次使用它,因此我想使用单个方法管理一次异常,并始终获得相同的消息error@user1951947那么,将这个错误消息规范化移动到方法中不是更好吗?正如我所说的,如果这不是一个选项,那么你的解决方案对我来说似乎没问题。是的,我同意你的观点,这件事应该在Contract类中进行,不幸的是,它从外部参与者变成了现在的样子,改变它的选项是不可能的,然后我决定为Contract类编写一种“代理”。我明白了,如果不是太大的话,你可以用组合来包装它。是的,包装它并覆盖我必须调用的方法也是一个很好的解决方案,我喜欢。