如何从生成它的方法之外的异常中获取消息?

时间:2016-01-12 22:25:49

标签: java

我已经使用正确的 try {} catch {} 块编写了我的Java代码来处理异常,但是一旦发生错误并显示典型消息(例如,通过控制台),我如何获取异常消息,堆栈跟踪或来自该方法之外的类似文本 ,以便进一步处理它以详细说明如何对他们做出反应?

我正在使用多代理系统,并且处理代理错误的方法是对这种消息进行文本处理(例外等)以决定如何表现。但是如果生成方法返回,如何访问该文本,让我们说,一个整数[]?

3 个答案:

答案 0 :(得分:0)

使用try {} catch {}语句时,显示控制台显示的错误消息是因为(我猜测)自动生成的方法存根(例如

try{

}catch(Exception e){
     //TODO autogenerated method stub
     e.printStackTrace();
}

对" e.printStackTrace()"的调用是什么实际打印到控制台。 您可以将其存储在变量中并对其执行分析,而不是将此打印输出到控制台。

答案 1 :(得分:0)

您不应该使用应用程序逻辑的异常。如果您希望代理响应消息,请实现消息队列系统。每个代理都有自己的消息队列,它将检查它以查看它具有的消息。处理邮件取决于您的代理的生命周期。

要发送邮件,您可以直接将其添加到收件人的邮件队列中,但更好的解决方案是让调度程序接受包含收件人和邮件的Message对象,然后它找出应该接收消息的正确代理。

您不必使用消息库;你应该能够使用Queue<E>自己写一个简单的。如果您的代理程序都在自己的线程中运行,请注意潜在的并发问题。

答案 2 :(得分:0)

您可以随时使用例外并使用以下内容:

import java.util.function.Consumer;

public class ExceptionalOptional<T> {

  @FunctionalInterface
  interface RunnableWithException<T> {
    public T call() throws Exception;
  }

  private final T         value;
  private final Exception exception;

  public ExceptionalOptional(T value) {
    this.value = value;
    this.exception = null;
  }

  public ExceptionalOptional(Exception exception) {
    this.value = null;
    this.exception = exception;
  }

  public static <T> ExceptionalOptional<T> from(T value) {
    return new ExceptionalOptional<T>(value);
  }

  public static <T> ExceptionalOptional<T> from(Exception e) {
    return new ExceptionalOptional<T>(e);
  }

  public static <T> ExceptionalOptional<T> wrap(
      RunnableWithException<T> runnable) {
    try {
      return from(runnable.call());
    } catch (Exception e) {
      return from(e);
    }
  }

  public boolean hasValue() {
    return exception == null;
  }

  public boolean hasThrown() {
    return exception != null;
  }

  public T getValue() {
    return value;
  }

  public Exception getException() {
    return exception;
  }

  public ExceptionalOptional<T> withValue(Consumer<T> consumer) {
    if (hasValue()) {
      consumer.accept(value);
    }
    return this;
  }

  public ExceptionalOptional<T> onException(Consumer<Exception> consumer) {
    if (hasThrown()) {
      consumer.accept(exception);
    }
    return this;
  }

  public <E extends Exception> ExceptionalOptional<T> onException(
      Consumer<E> consumer, Class<E> klass) {
    if (hasThrown() && klass.isInstance(exception)) {
      consumer.accept(klass.cast(exception));
    }
    return this;
  }
}

这使您可以像这样开始处理您的用例:

ExceptionalOptional<FileInputStream> fis = 
    wrap(() -> new FileInputStream(new File("test.txt")));

我仍然认为你想做的是XY problem