【问题标题】:Unable to catch exception from logging无法从日志中捕获异常
【发布时间】:2012-01-06 06:21:32
【问题描述】:

尝试使用过期密码登录 ldap 服务器时,日志记录中会引发异常。

javax.naming.AuthenticationException:[LDAP:错误代码 49 - 80090308: LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误,数据 773,v1db0

我想给用户一个相应的消息,但我无法捕捉到那个异常。 (我怎样才能得到日志中显示的异常?因为 data 773 表示密码已过期

                CallbackHandler handler = new UsernamePasswordHandler(
                        username, password);
                LoginContext lc = new LoginContext(applicationPolicyName,
                        handler);

                try {
                    lc.login();
                } catch (Exception){
                    log.warn(e.getMessage());
                }

【问题讨论】:

  • 注意:日志中的异常不是由 log.warn(e.getMessage());
  • 不使用 JNDI 的众多原因之一,它很奇怪,违反直觉,并且难以处理简单的事情,例如超出结果代码的大小限制、超出结果代码的时间限制和其他类似的非常基本的LDAP 主题。我建议开发人员不要将 JNDI 用于新代码,而是更喜欢 UnboundID LDAP SDK。标准版可免费使用。另外,您可能对LDAP: Programming Practices感兴趣。

标签: java ldap


【解决方案1】:

您需要掌握异常堆栈跟踪。 (如有必要,更改您的日志配置,以便将堆栈跟踪写入日志。)

这会告诉你异常在哪里被抛出。

然后检查源代码以查看它在哪里被捕获和记录,并查看是否有任何代码可以首先捕获它。

【讨论】:

    【解决方案2】:

    假设您要捕获的是 javax.naming.AuthenticationException 类型的,您可以将其放入 try catch 块中:

    try {
      lc.login();
    } catch(AuthenticationException e) {
       processError(e.getMessage());
    }
    
    ...
    private void processError(String errorMessage) {
      if (errorMessage.contains("data 773")) {
         // then do your stuff here like add error message as label etc
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多