1

我正在研究对文件执行一些运行时子进程的 java 应用程序,对于某些文件我得到错误导致向 Microsoft 发送错误报告窗口出现,我需要以编程方式处理此错误,而不向用户显示此窗口。请问有人可以帮忙吗?

4

2 回答 2

1

抑制 Windows 错误报告正在调用的 .exe 不应因未处理的异常而终止。这仅在您有权访问应用程序源时才有效。

基于WER 参考- 您应该使用 Win32 API 调用WerAddExcludedApplication将您打算忽略的特定 .exe 文件添加到每个用户的忽略列表中 - 您可以创建一个简单的存根应用程序,允许您通过以下方式添加应用程序名称到忽略列表。然后,当您调用应用程序时,它不会触发错误。

同样,您可以使用WerRemoveExcludedApplication创建另一个应用程序来删除它们。

替代方法是使用 JNI/JNA 创建一个类来封装此功能,而不是使用Runtime.exec

这是一个使用Java Native Access (JNA)的简单示例,它是 JNI 的更简单版本(大部分不需要 C++)。下载 jna.jar 并使其成为您项目的一部分。

import com.sun.jna.Native;
import com.sun.jna.WString;
import com.sun.jna.win32.StdCallLibrary;

public class JNATest {

    public interface CLibrary extends StdCallLibrary {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("wer.dll", 
            CLibrary.class);
        int WerAddExcludedApplication(WString name, boolean global);
        int WerRemoveExcludedApplication(WString name, boolean global);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.WerAddExcludedApplication(new WString("C:\\foo.exe"), false);
        CLibrary.INSTANCE.WerRemoveExcludedApplication(new WString("C:\\foo.exe"), false);
    }
}

基本上,将新WString(...)值替换为您打算忽略的应用程序的名称。出于 Windows 错误报告的目的,此时应忽略它。

请记住,这wer.dll仅适用于 Windows Vista 和更新版本,因此如果这是一个问题,那么您可能需要手动编辑注册表项。

于 2012-07-04T07:58:40.487 回答
0

您始终可以使用 try-catch-finally 语句:

try
{
    some code here (the code that is causing the error);
}
catch (Exception x)
{
    handle exception here;
}

这个对我有用...

编辑这里是可以帮助你更多一点的链接:

http://www.exampledepot.com/egs/Java%20Language/TryCatch.html

于 2012-07-04T07:44:29.460 回答