Java如何捕获应用程序的Runtime error

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java如何捕获应用程序的Runtime error相关的知识,希望对你有一定的参考价值。

但这些程序存在Runtime error 错误。在运行时会报错误。我想把这些错误用Java 捕捉到。并将这些Runtime error解释出来因为Runtime的和Cheched的都继承Exception虽然严格上说不推荐使用但我都是try 之后, checked的异常都一个一个罗列出来最后都再加上catch所有Exception不行吧,我试过很多中异常捕捉,都不捉不到。是不是因为这个错误时系统错误啊。Java中的Runtime.getRuntime().exec()只负责执行.exe文件但并不能通过catch获得错误信息。 问题补充:mavlarn 写道java捕获的异常,是jvm内部产生的,而调用系统程序,java对它根本没有办法得到任何信息。mavlarn 写道java捕获的异常,是jvm内部产生的,而调用系统程序,java对它根本没有办法得到任何信息。p = rtRuntime.exec("d:\\test\\data1.bat");小卓SUN 写道引用不行吧,我试过很多中异常捕捉,都不捉不到。是不是因为这个错误时系统错误啊。Java中的Runtime.getRuntime().exec()只负责执行.exe文件但并不能通过catch获得错误信息。Process p = Runtime.getRuntime().exec() p.getErrorStream()n //这个是获取调用程序时候出现的错误 没有仔细看,你描述的并不是RuntimeException是别的程序的错误 问题补充:那我试试mavlarn 写道windows程序出错的话,应该是可能会在系统的事件查看器中看到的,但是,java不可能可以访问的到windows系统的事件查看器,因为java不是为windows开发的,这种跟系统相关的功能肯定是没有的。如果说一定要得到事件查看器里面的出错信息,只有一个办法,就是用JNDI的api,用C写一个获取系统事件的模块,然后在java里面调用。(或者是不用jndi,直接用c写一个可执行的程序,获取系统的事件查看器里的某些事件,然后用系统调用)。但是,这应该很麻烦。用java做这种跟系统紧密相关的东西,本来就不合适。 参考技术A

Java中的异常都是继承自Throwable,所以如下代码可以catch【一个线程下】所有的异常:

try
  // 一些代码
catch(Throwable e)
  e.printStackTrance();// 输出异常

如果程序是多线程,那么需要在每个线程的调用开始时进行try-catch,比如:

new Thread("新线程")
   public void run()
       try/* 一些代码*/catch(Throwable e)e.printStackTrance();
   
.start();// 开启新线程

参考技术B try
catch(Exception e)

无法捕获 std::runtime_error

【中文标题】无法捕获 std::runtime_error【英文标题】:Unable to catch a std::runtime_error 【发布时间】:2015-08-20 17:58:42 【问题描述】:

也许我今天没有喝足够的咖啡。下面的程序应该会捕获 std::runtime_error 并打印“我捕获了 runtime_error”,对吧?

事实并非如此。该程序没有捕获 std::runtime_error 而是打印“为什么我无法捕获 runtime_error”?

我在这里做错了什么?为什么我没有捕捉到 std::runtime_error?

这是 Clang(参见代码下方的环境信息)。

#include <iostream>
#include <exception>

int main(int argc, const char * argv[])

    try
    
        throw new std::runtime_error( "a runtime_error was thrown" );
    
    catch ( const std::runtime_error& e )
    
        std::cout << "i caught the runtime_error" << std::endl;
    
    catch ( ... )
    
        std::cout << "why was i unable to catch the runtime_error?" << std::endl;
    
    return 0;

OS X 10.9.5 上的 Xcode 5.1.1

comp:~ usrn$ clang --version
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
comp:~ usern$ 

【问题讨论】:

你不应该在这里使用new 出于某种原因,我认为需要堆分配异常。我不知道我是怎么想到的。 【参考方案1】:

你在扔new std::runtime_error( "a runtime_error was thrown" );

所以你扔了一个std::runtime_error*

你可能想做throw std::runtime_error("..."),即按值抛出。

【讨论】:

是的。那很快。谢谢。 或者更好:抛出一个堆分配的对象。按值抛出,按常量引用捕获。 您是否建议他们继续使用new 完全没有,只是陈述事实。但我可能应该澄清:) melak47,您应该在答案的末尾添加不使用堆分配抛出的建议。谢谢!

以上是关于Java如何捕获应用程序的Runtime error的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获 System.exit 事件?

无法捕获 std::runtime_error

未捕获的错误:找不到模块“react/jsx-runtime”

是否可以从 Java 程序中捕获 Windows 弹出消息框?

异常处理

chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”