我已经使用正确的 try {} catch {} 块编写了我的Java代码来处理异常,但是一旦发生错误并显示典型消息(例如,通过控制台),我如何获取异常消息,堆栈跟踪或来自该方法之外的类似文本 ,以便进一步处理它以详细说明如何对他们做出反应?
我正在使用多代理系统,并且处理代理错误的方法是对这种消息进行文本处理(例外等)以决定如何表现。但是如果生成方法返回,如何访问该文本,让我们说,一个整数[]?
答案 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。