mybatis与 Exception

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis与 Exception相关的知识,希望对你有一定的参考价值。

技术分享

 

mybatis将所有的异常全部包成了运行时异常,减少在高层代码中频繁的try-catch导致的代码臃肿问题。Persistence是它们共有的父类,继承自RuntimeException非检查型异常。IbatisException已经被弃用,每个异常类包装了它们对应的组件的异常信息,根据异常的类型和message我们很容易的可以定位到异常,并获取有用的帮助信息。

 

 

另外一部分则是这个异常包装器

技术分享

Mybatis暴露的API接口(SessionBuilder,Session操作)都用这个包装器将所有的异常包装成一个PersistenceException

public class ExceptionFactory {

  private ExceptionFactory() {
    // Prevent Instantiation
  }

  public static RuntimeException wrapException(String message, Exception e) {
    return new PersistenceException(ErrorContext.instance().message(message).cause(e).toString(), e);
  }

}

异常的message来自 ErrorContext类,它是异常信息的上线文,提供了线程内的异常信息的通信和组装,系统中的其他组件可以随时随地的将当时可能的异常上下文加入到这个ErrorContext中

 

技术分享

 

ErrorContext最重要的设计是LOCAL成员,他是个ThreadLocal对象,隔离线程间的数据,所以这个异常上下文对象是线程私有的

ErrorContext还提供了异常信息的格式化打印工作

  @Override
  public String toString() {
    StringBuilder description = new StringBuilder();

    // message
    if (this.message != null) {
      description.append(LINE_SEPARATOR);
      description.append("### ");
      description.append(this.message);
    }

    // resource
    if (resource != null) {
      description.append(LINE_SEPARATOR);
      description.append("### The error may exist in ");
      description.append(resource);
    }

    // object
    if (object != null) {
      description.append(LINE_SEPARATOR);
      description.append("### The error may involve ");
      description.append(object);
    }

    // activity
    if (activity != null) {
      description.append(LINE_SEPARATOR);
      description.append("### The error occurred while ");
      description.append(activity);
    }

    // activity
    if (sql != null) {
      description.append(LINE_SEPARATOR);
      description.append("### SQL: ");
      description.append(sql.replace(‘\\n‘, ‘ ‘).replace(‘\\r‘, ‘ ‘).replace(‘\\t‘, ‘ ‘).trim());
    }

    // cause
    if (cause != null) {
      description.append(LINE_SEPARATOR);
      description.append("### Cause: ");
      description.append(cause.toString());
    }

    return description.toString();
  }

 

以上是关于mybatis与 Exception的主要内容,如果未能解决你的问题,请参考以下文章

mybatis动态sql片段与分页,排序,传参的使用

NDK: ant 错误 [javah] Exception in thread "main" java.lang.NullPointerException 多种解决办法(代码片段

spring3.2.0与mybatis3.2.7整合出错--Failed to read candidate component class--nested exception is java.lan

markdown [mybatis参考]关于mybatis #mybatis的一些片段

Spring+SpringMVC+MyBatis+Maven框架整合

[问题]org.mybatis.generator.exception.XMLParserException: XML Parser Error on line 18: 对实体 "chara