mysql驱动对SQLException的wrap

MysqlIO会对数据库返回的resultPacket进行checkError

  private void checkErrorPacket(Buffer resultPacket) throws SQLException {
    int statusCode = resultPacket.readByte();

    // Error handling
    if (statusCode == (byte) 0xff) {
      String serverErrorMessage;
      int errno = 2000;

      if (this.protocolVersion > 9) {
        errno = resultPacket.readInt();
        String xOpen = null;
        serverErrorMessage = resultPacket.readString(this.connection.getErrorMessageEncoding(), getExceptionInterceptor());

        if (serverErrorMessage.charAt(0) == '#') {
          // we have an SQLState
          if (serverErrorMessage.length() > 6) {
            xOpen = serverErrorMessage.substring(1, 6);
            serverErrorMessage = serverErrorMessage.substring(6);

            if (xOpen.equals("HY000")) {
              xOpen = SQLError.mysqlToSqlState(errno, this.connection.getUseSqlStateCodes());
            }
          } else {
              xOpen = SQLError.mysqlToSqlState(errno, this.connection.getUseSqlStateCodes());
          }
        } else {
          xOpen = SQLError.mysqlToSqlState(errno, this.connection.getUseSqlStateCodes());
        }

        clearInputStream();

        StringBuilder errorBuf = new StringBuilder();

        String xOpenErrorMessage = SQLError.get(xOpen);

        if (!this.connection.getUseOnlyServerErrorMessages()) {
          if (xOpenErrorMessage != null) {
            errorBuf.append(xOpenErrorMessage);
            errorBuf.append(Messages.getString("MysqlIO.68"));
          }
        }
        errorBuf.append(serverErrorMessage);

        if (!this.connection.getUseOnlyServerErrorMessages()) {
          if (xOpenErrorMessage != null) {
            errorBuf.append("\"");
          }
        }

        appendDeadlockStatusInformation(xOpen, errorBuf);

        if (xOpen != null && xOpen.startsWith("22")) {
           throw new MysqlDataTruncation(errorBuf.toString(), 0, true, false, 0, 0, errno);
        }
        throw SQLError.createSQLException(errorBuf.toString(), xOpen, errno, false, getExceptionInterceptor(), this.connection);
     }

     serverErrorMessage = resultPacket.readString(this.connection.getErrorMessageEncoding(), getExceptionInterceptor());
     clearInputStream();

     if (serverErrorMessage.indexOf(Messages.getString("MysqlIO.70")) != -1) {
       throw SQLError.createSQLException(SQLError.get(SQLError.SQL_STATE_COLUMN_NOT_FOUND) + ", " + serverErrorMessage,
       SQLError.SQL_STATE_COLUMN_NOT_FOUND, -1, false, getExceptionInterceptor(), this.connection);
     }

     StringBuilder errorBuf = new StringBuilder(Messages.getString("MysqlIO.72"));
     errorBuf.append(serverErrorMessage);
     errorBuf.append("\"");

     throw SQLError.createSQLException(SQLError.get(SQLError.SQL_STATE_GENERAL_ERROR) + ", " + errorBuf.toString(), SQLError.SQL_STATE_GENERAL_ERROR, -1,
                    false, getExceptionInterceptor(), this.connection);
    }
}

猜你喜欢

转载自my.oschina.net/u/3787772/blog/2980222