我尝试用Java代码执行jar:
Runtime.getRuntime.exec("java -jar a.jar")
我可以从Process.getErrorStream()
获得错误的InputStream。
我是否可以使用此流,如果它有一个Exception将其转换为Exception并抛入我的上层应用程序?
Java有一些将字符串转换为Exception的机制吗?
编辑:或者也许java有一些像System.exit(int code)
这样的机制但是有异常?所以在父应用程序中,我可以执行类似process.waitFor()
的操作,但是使用异常代替int代码?
答案 0 :(得分:0)
Process.getErrorStream()
返回连接到子流程错误输出的IntputStream
。
因此,它在Java术语中并不例外。它是一个输出信息,必须将其视为过程在执行过程中检测到的错误 Java不会自动将InputStream或String转换为Exception。
因此,您可以在String中读取此流并使用字符串作为消息抛出自定义异常。
如果您希望调用者能够以干净的方式处理此异常,请不要使用RuntimeException
但是检查异常:
public class ProcessExecutionException extends Exception{
public ProcessExecutionException(String errorOutputMsg){
super(errorOutputMsg);
}
}
编辑以回复您的评论:
是的,但如何检查输入流线是堆栈跟踪的一部分 儿童例外
它不是一个stracktrace,而是如所解释的错误信息。
以及IS i应该向ProcessExecutionException添加多少行?`
如果要捕获所有错误输出,则必须读取所有errorStream,直到它返回null。
在我的情况下,我的jar是一个Spring应用程序,它写入错误流 也不仅仅是我真正需要捕获的异常,也是一些信息 喜欢"错误,你没有sl4j xml文件等 - 比如示例"。和我 只需要非常重要的例外
输出错误的类如何猜测它对你是否重要?
您必须自己决定哪种错误消息模式应被视为重要错误
就个人而言,如果我的进程运行时,我有一个配置不好的记录器,我会杀死它并在再次启动它之前解决这个问题。
如果您在ErroStream中有输入,您还可以检查Process.exitCode()
(0
:正常终止,否则问题)的值。
如果它与0
不同,您可以怀疑它不仅仅是一个小问题。
在这里,尝试一些曲目。
我可以像在System.exit()
中那样返回一些东西
在子进程中,您可以尝试拦截可能触发的所有未处理的异常。无论如何都可以这样做(方面,全局尝试/捕获,过滤......)
这样,如果您截取未处理的异常并且认为必须终止该应用程序,则可以使用父进程使用预期代码执行System.exit
。
这样,在父级中,如果Process.exitCode()
与重要异常的预期代码匹配,则可以按照自己的意愿处理。