尝试/捕捉内部或外部功能

Mit*_*ogl 7 java exception try-catch

关于使用try/的最佳实践,我有一个非常基本的问题catch.我有一个像这样的简单函数(DAO)

public void addVehicle(Vehicle vehicle) {

    em.getTransaction().begin();
    em.persist(vehicle);
    em.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud)

并在Web服务中使用DAO功能:

@WebMethod(operationName = "addVehicle")
public void addVehicle(Vehicle vehicle) {

    try {
        vehicleDAO.addVehicle(vehicle);
        System.out.print("Vehicle added");
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者更好地使用try/ catch内部DAO函数,如下所示:

public void addVehicle(Vehicle vehicle) {

    try {
        em.getTransaction().begin();
        em.persist(vehicle);
        em.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*ien 9

对此没有完美的规则.

如果在需要时尽早捕获异常,则代码通常更清晰,更简单,但应尽可能晚.
您应该考虑在Exception发生这种情况时谁必须采取行动,这将决定您catch是否在方法内(addVehicle)或者您throw是否调用者必须这样catch做.

例如:

 public void addVehicle(Vehicle vehicle) throws SQLException{
        em.getTransaction().begin();
        em.persist(vehicle);
        em.getTransaction().commit();
 }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,调用者必须捕获.
进一步只在少数情况下你应该抓住Exception或者RunTimeException更好地捕获特定的异常,IOException而不是Exception.

在你的代码中的某个地方,你需要一个"最后一道防线"才有意义.catch (Exception ex).这是处理不应该发生的错误所必需的.


The*_*kis 5

当决定在哪里处理特定类型的异常时,最好的经验法则是停止查看代码的微观细节,退后一步来推理程序的逻辑并考虑以下事项:

  • 您的程序当前的操作是否无法从该异常中恢复?如果是,则只有将异常放在该操作的最顶层才有意义,以确保它不会继续。
  • 如果您的程序可以解决该特定异常(也许在放弃之前尝试其他方法),请使用每一层嵌套函数(从最高层开始),并每次问自己:如果在执行某行代码期间发生异常在这个函数中,这个函数继续下去有意义吗?只要答案是“是”,就向更深层次迈进。一旦答案是“否”,这很可能是放置该异常处理程序的最佳位置。
  • 除了前一个方案之外,您还可以决定程序的备用“攻击计划”,以防引发异常。然后,转到会引发该异常的代码行并问自己:此函数是否有足够的上下文信息来执行我想到的解决方法?只要答案是“否”,就转到调用者函数。一旦答案变为“是”,请考虑将异常处理程序放在那里。

话虽这么说,您应该只捕获相当专门的异常,并将该catch(Exception ex)构造仅作为顶层的最后手段,并且仅在所有其他可能的块之后catch保留,仅将其保留用于当时您确实无法预测的异常类型写作。(我知道你说这不是这个例子的重点,但既然我们已经讨论了这个问题,我认为应该提及它以使这个答案更加完整。)