区分相同类型的异常

时间:2015-01-20 18:41:46

标签: java exception

例如,类型: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();
        }

1 个答案:

答案 0 :(得分:5)

这取决于。如果这是您拥有或有权访问的代码,并且BindException不合适,那么您应该创建自己的异常:

public class PermissionDeniedException

你甚至可以这样做:

public class PermissionDeniedBindException extends BindException 

但是,如果这不是你的类,那么你正在使用的库不希望你区分BindException,并期望你在接收异常时以某种通用的方式行事(即只是继续或者总是再次尝试)或者这是SDK中的一个问题。如果后者是这种情况并且该项目是开源的,我建议创建一个拉取请求。

否则,第三个选项当然就像你正在做的那样...但我不会建议它,因为它非常脆弱,只能通过修改消息来改变。