/**
   * ログ取得コードをThrowableのcatch節として追加する
   *
   * @param pool Statementを含むプール
   * @param ctClass PreparedStatementを実装するクラス
   * @param behaviour behaviour
   * @throws CannotCompileException コンパイルができないときの例外
   */
  public static void convertCatch(
      final ClassPool pool, final CtClass ctClass, final CtBehavior behaviour)
      throws CannotCompileException {
    try {
      CtClass throwable = pool.get("java.lang.Throwable");

      // メソッドの定義がない場合は実行しない。
      final int MODIFIER = behaviour.getModifiers();
      if (Modifier.isAbstract(MODIFIER)) {
        return;
      }

      // JavelinLogger#writeExceptionLogの呼び出しコードを作成する。
      StringBuffer code = new StringBuffer();

      // 後処理(例外場合)
      code.append(JAVELIN_RECORDER_NAME);
      code.append(".postProcessNG(");
      code.append("$e");
      code.append(");");

      // 例外を再throwする。
      code.append("throw $e;");

      // ログ取得コードをThrowableのcatch節として追加する。
      behaviour.addCatch(code.toString(), throwable);
    } catch (NotFoundException nfe) {
      SystemLogger.getInstance().warn(nfe);
    }
  }
 /**
  * ジョブ開始時、終了時、失敗時の処理を埋め込む。
  *
  * @param ctMethod 埋め込み対象のメソッド
  * @throws CannotCompileException
  */
 private void insertProcessesForJob(final CtBehavior ctMethod) throws CannotCompileException {
   ctMethod.insertBefore(MapReduceTaskMonitor.class.getName() + ".preProcess(this);");
   ctMethod.insertAfter(MapReduceTaskMonitor.class.getName() + ".postProcess(this);");
   ctMethod.addCatch(
       "{"
           + MapReduceTaskMonitor.class.getName()
           + ".postProcessNG(this, $e); $e.printStackTrace(); throw $e;}",
       throwableClass_);
 }