区分相同类型的异常

distinguish exceptions of same type

例如,异常类型:java.net.BindException可以抛出一个"Address already in use"(试图绑定另一个程序使用的端口)或"Permission denied"(你没有root权限打开此端口号)。我不拥有抛出 BindException 的 class。

那么,区分这些 "different" 具有相同类型的异常的最佳做法是什么?

我正在这样做,但我不知道这是否是最佳做法:

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();
        }

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

public class PermissionDeniedException

你甚至可以这样做:

public class PermissionDeniedBindException extends BindException 

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

否则,第三个选项当然是完全按照您的方式来做...但我根本不建议这样做,因为它非常脆弱并且可以通过修改消息来更改。