【问题标题】:Adding exception to existing method向现有方法添加异常
【发布时间】:2023-04-04 17:56:01
【问题描述】:

我有一个简单的数据库连接方法,我想添加一个条件,即如果连接失败,则会向人员列表发送一封电子邮件,告知连接失败。

我目前的方法是这样的:

public Connection createInitialConnection() throws ClassNotFoundException, SQLException, PollingException
{
    DBConnectionDetails conDetails = new DBConnectionDetails("INITIAL");

    Class.forName(conDetails.getDriver());      
    Connection connInitial = DriverManager.getConnection(conDetails.getUrl(),
                                      conDetails.getUser(), conDetails.getPassword());
    logger.info("Initial connection created" + conDetails.getUrl());

    return connInitial;
}

目前,没有检查连接是否成功,如果没有连接则程序继续运行。

我不确定最好的方法是什么。 if/else 还是 try/catch?

【问题讨论】:

  • IllegalStateException 或 null 以及您使用 createInitialConnection 的位置检查是否 != null
  • 我认为你应该捕获 SQLException ,然后尝试发送邮件。
  • 您在那里使用什么数据库技术?您应该尝试确定连接失败时引发的异常类型。然后是的,使用 try/catch 语句。
  • 这是题外话,但我想问一下。你确定这个系统会为每次失败的尝试发送电子邮件吗?如果这是一个网页等,那么如果连接失败(由于数据库关闭等),那么您的系统可能开始每分钟发送如此多的电子邮件,而不是它基本上会变成一个很好的垃圾邮件发送者机器;)
  • @T.G.能够限制电子邮件会很好。也使用连接池可以减少连接重试次数。

标签: java


【解决方案1】:

像 log4j 这样的日志库允许您添加一个日志附加器,为每个日志条目发送电子邮件(当然您可以按严重性、类别等进行过滤)。因此,当您尝试建立连接并引发异常时,它应该被异常处理程序捕获并记录下来,并且记录器将发送电子邮件。

这假设您的应用程序有某种异常处理程序来记录未捕获的异常。发生这种情况的位置取决于您的应用程序的体系结构。它可以在 servlet 中,在 jsp 中的 try-catch 代码中,或者在 webapp 框架(如 struts 或 spring-mvc)中的专用处理程序中。

如果您实现了这一点,您将有办法在记录任何异常时收到通知,这将不仅限于数据库连接问题。

【讨论】:

  • 我推荐这种方法而不是在 try-catch 中发送电子邮件;这样,您所有的“厄运”电子邮件都会从日志记录附加程序启动,您可以禁用它或将其替换为另一种机制以进行测试或在另一个项目中重用代码。
【解决方案2】:

您可以在catch 块上发送电子邮件。

try{
    Class.forName(conDetails.getDriver());      
    Connection connInitial = DriverManager.getConnection(conDetails.getUrl(),
                      conDetails.getUser(), conDetails.getPassword());

 }
 catch(SQLException | ClassNotFoundException ex){ // Java 7 needed for multicatch
   // Send the Email.
 }

【讨论】:

    【解决方案3】:

    也许您应该尝试捕获 SQLExcepton,然后像这样发送通知:

      try {
        Connection connInitial = DriverManager.getConnection(conDetails.getUrl(), conDetails.getUser(), conDetails.getPassword());
      } catch (SQLException e) {
        //send notification here
      }
    

    【讨论】:

      【解决方案4】:

      捕获块。总是比 if-else 好

      try{
      
       // your Logic to test the connection
      
      }
      catch(Exception ex)
      {
       //Code to send the mail if the connection is failed.
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用 try { } Catch .. 这以防万一您遇到没有网络或其他问题的情况。之后你需要检查Connection != null.. 这就是你所需要的

        【讨论】:

          【解决方案6】:

          在 catch 块中发送电子邮件对您的应用程序来说可能没问题,但是您将面临如何配置电子邮件的问题。谁应该收到它?是否可以有多个收件人?应该如何配置发件人、主题和格式并将其传递给您的邮件程序?如果邮件程序失败了怎么办?如果你走这条路,你可能会发现自己正在重新发明现有的解决方案。

          如果您使用 Log4j,最好为您现有的记录器configure a SMTPAppender 或为需要通过电子邮件发送的错误创建记录器。如果您愿意,您可以将 Log4j 配置为仅将附加程序用于 SQL 异常(即log4j: Log output of a specific class to a specific appender)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-26
            • 1970-01-01
            • 1970-01-01
            • 2014-12-22
            相关资源
            最近更新 更多