エラー定義

Mule では、エラーとは、何か問題が発生したことを伝達し、意味のある情報を提供することで、ユーザーがスローされたエラーの種類に応じて修正措置を取ることができるようにする方法です。

詳細は、​「エラー処理について」​を参照してください。

モジュールエラーの定義

最初のステップは、モジュールによってスローされる可能性があるすべてのエラーを定義することです。これを行うには、​ErrorTypeDefinition​ インターフェースを実装する ​enum​ を定義します。 この ​enum​ で定義された各値はエラーとみなされます。

public enum SimpleError implements ErrorTypeDefinition<SimpleError> {
      INVALID_PARAMETER,
      TIME_OUT,
      NOT_ALLOWED
}

エラー階層

モジュールエラーは、同じモジュールのエラー (同じ ​enum​ の値) または Mule エラーからのみ継承できます。Mule エラーは、 ​org.mule.runtime.extension.api.error.MuleErrors​ で定義されます。

親エラーを定義していないエラーは、自動的に ​MULE:ANY​ から継承されます。

public enum HierarchalError implements ErrorTypeDefinition<HierarchalError> {
    INVALID_PARAMETER,
    TIME_OUT,
    NOT_ALLOWED,
    ILLEGAL_ACTION(NOT_ALLOWED),
    BAD_CREDENTIALS(MuleErrors.CONNECTIVITY);

    private ErrorTypeDefinition<? extends Enum<?>> parent;

    HierarchalError(ErrorTypeDefinition<? extends Enum<?>> parent) {
        this.parent = parent;
    }

    HierarchalError() {
    }

    @Override
    public Optional<ErrorTypeDefinition<? extends Enum<?>>> getParent() {
        return Optional.ofNullable(parent);
    }
}

モジュールのエラーの登録

@Extension​ アノテーションが付加されたクラスは、モジュールが処理するエラーを示すために ​@ErrorTypes​ のアノテーションが付加されている必要があります。このアノテーションは、定義されたエラーを含む ​ErrorTypeDefinition​ ​enum​ を参照します。

@Extension(name = "Foo")
@ErrorTypes(HierarchalError.class)
@Xml(prefix = "test-connector")
public class FooExtension {
  // Content
}

スローされる可能性があるエラーの指定

モジュールで発生する可能性があるすべてのエラーを宣言したら、それらをスロー する可能性がある操作にエラーをバインドする情報を提供する必要があります。

これを行うには、​ErrorTypeProvider​ を実装する必要があります。これは、操作によってスロー される可能性があるエラーを伝達するクラスです。

public class ExecuteErrorsProvider implements ErrorTypeProvider {
    @Override
    public Set<ErrorTypeDefinition> getErrorTypes() {
        HashSet<ErrorTypeDefinition> errors = new HashSet<>();
        errors.add(HierarchalErrors.INVALID_PARAMETER);
        errors.add(HierarchalErrors.BAD_CREDENTIALS);
        errors.add(HierarchalErrors.ILLEGAL_ACTION);
        return errors;
    }
}

ErrorTypeProvider​ を定義したら、それを適切な操作にバインドする 必要があります。次のように、操作レベルで ​@Throws​ アノテーションを使用してバインドします。

@Throws(ExecuteErrorsProvider.class)
public void execute(){
  // operation body
}

Studio または Flow Designer で、​@Throws​ アノテーションが付加された操作は、その操作がスローする可能性があるエラーについてのヒントをユーザーに提供します。

studio errors

XML は次のようになります。

<flow name="flowName">
  <try>
    <test-connector:execute/>
    <error-handler >
      <on-error-continue type="TEST-CONNECTOR:ILLEGAL_ACTION">
        <logger level="INFO" message="#[error]"/>
      </on-error-continue>
    </error-handler>
  </try>
</flow>

エラーのスロー

エラーは、特定のエラーにバインドされている Java 例外の Mule 表現です。

エラーと例外の間に静的なバインドはありません。エラーを伝達 するには、操作が ​org.mule.runtime.extension.api.exception.ModuleException​ または このクラスの子例外をスローし、コンストラクター内でスローする目的の ​ErrorTypeDefinition​ を示す必要があります。

@Throws(ExecuteErrorsProvider.class)
public void execute(){
  try {
      throw new IllegalStateException();
  } catch (IllegalStateException e){
      throw new ModuleException(HierarchalErrors.ILLEGAL_ACTION, e);
  }
}

また、このロジックを新しい例外クラス内にラップすることをお勧めします。

public final class IllegalActionException extends ModuleException {

  public IllegalActionException(Exception cause) {
    super(HierarchalErrors.ILLEGAL_ACTION, cause);
  }
}
操作の ​ErrorTypeProvider​ で宣言されていないエラーをスローすると、 予期せぬエラーの例外が発生します。操作で宣言されていないエラーをスローすることはできません。