Java中如何捕获并解析IOException的错误代码?
我来帮你搞定这个问题——用ProcessBuilder执行外部程序时,遇到的这类IO异常其实都藏着系统级的错误代码,我们可以通过拆解异常链来拿到这些代码,进而做针对性的处理。
先看你提供的代码:
ProcessBuilder processBuilder = new ProcessBuilder(file.getAbsolutePath()); processBuilder.directory(file.getParentFile()); try { processBuilder.start(); System.exit(0); } catch(IOException ex) { ex.printStackTrace(); }
你遇到的两种典型错误场景:
- 当目标路径是
C://时,抛出:java.io.IOException: Cannot run program "C:\Users\User\Documents\NetBeansProjects\UsefulTul": CreateProcess error=5, 存取被拒。
- 当路径是不存在的
C://sdfsdsfjsdi时,抛出:java.io.IOException: Cannot run program "c:\sdfsdsfjsdi " (in directory "c:"): CreateProcess error=2, 系統找不到指定的檔案。
捕获并解析错误代码的具体实现
在Windows系统下,ProcessBuilder抛出的IOException的底层根源异常是java.io.Win32Exception,它直接携带了系统原生的错误代码。我们可以通过遍历异常链找到它,然后提取代码做处理:
修改你的catch块,改成这样:
catch (IOException ex) { // 遍历异常链,定位到系统级异常 Throwable currentCause = ex.getCause(); while (currentCause != null) { if (currentCause instanceof java.io.Win32Exception) { java.io.Win32Exception winSysEx = (java.io.Win32Exception) currentCause; int errorCode = winSysEx.getErrorCode(); System.out.println("捕获到系统错误代码:" + errorCode); // 根据错误代码做针对性提示或处理 switch (errorCode) { case 2: System.err.println("错误:指定的文件或路径不存在,请检查路径是否正确"); break; case 5: System.err.println("错误:权限不足,无法访问目标路径,请检查文件权限或运行程序的身份"); break; // 可以根据需要添加更多常见错误代码的处理,比如error=193(不是有效的Win32程序) case 193: System.err.println("错误:目标路径不是可执行程序"); break; default: System.err.println("未知系统错误,代码:" + errorCode); } break; } currentCause = currentCause.getCause(); } // 如果没找到系统级异常,还是打印原始栈信息 if (currentCause == null) { ex.printStackTrace(); } }
跨平台补充说明
如果你的程序需要跑在Linux或macOS上,底层异常会变成java.io.UnixException,同样可以调用getErrorCode()获取对应的Unix errno(比如error=2同样对应文件不存在),处理逻辑可以复用,只需要多判断一种异常类型即可。
另外,系统错误代码的具体含义可以参考对应平台的官方文档:比如Windows的错误代码可以查微软官方的系统错误代码定义,Unix的errno可以查man手册。
内容的提问来源于stack exchange,提问作者TershiXia

