如何将inputrstream或string转换为Exception?

时间:2016-08-19 11:34:36

标签: java exception inputstream

我尝试用Java代码执行jar:

Runtime.getRuntime.exec("java -jar a.jar")

我可以从Process.getErrorStream()获得错误的InputStream。

我是否可以使用此流,如果它有一个Exception将其转换为Exception并抛入我的上层应用程序?

Java有一些将字符串转换为Exception的机制吗?

编辑:或者也许java有一些像System.exit(int code)这样的机制但是有异常?所以在父应用程序中,我可以执行类似process.waitFor()的操作,但是使用异常代替int代码?

1 个答案:

答案 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()与重要异常的预期代码匹配,则可以按照自己的意愿处理。