例如,类型:java.net.BindException的异常可以抛出一个"地址已经在使用" (尝试绑定另一个程序使用的端口)或" Permission denied" (你没有root权限来打开这个端口号。)我不拥有抛出BindException的类。
那么,区分这些"不同"的最佳做法是什么?具有相同类型的例外情况?
我这样做,但我不知道是否是最佳做法:
try {
//...some scary stuffs here
}
catch (BindException e){
if (e.getMessage().contentEquals("Permission denied")){
System.out.println("ERROR**You must be ROOT to bind that port address TCP:"+defaultPort);
}
else if (e.getMessage().contentEquals("Address already in use")){
System.out.println("ERROR**Port TCP:"+defaultPort+" already in use by onother application");
}
e.printStackTrace();
}
答案 0 :(得分:5)
这取决于。如果这是您拥有或有权访问的代码,并且BindException不合适,那么您应该创建自己的异常:
public class PermissionDeniedException
你甚至可以这样做:
public class PermissionDeniedBindException extends BindException
但是,如果这不是你的类,那么你正在使用的库不希望你区分BindException,并期望你在接收异常时以某种通用的方式行事(即只是继续或者总是再次尝试)或者这是SDK中的一个问题。如果后者是这种情况并且该项目是开源的,我建议创建一个拉取请求。
否则,第三个选项当然就像你正在做的那样...但我不会建议它,因为它非常脆弱,只能通过修改消息来改变。