Java 区分相同类型的异常

Java 区分相同类型的异常,java,exception,Java,Exception,例如,类型为java.net.BindException的异常可以抛出“地址已在使用”(尝试绑定另一个程序使用的端口)或“权限被拒绝”(您没有根权限打开此端口号)。我不拥有抛出BindException的类 那么,用同一类型区分这些“不同”异常的最佳实践是什么 我正在这样做,但我不知道这是否是一种最佳做法: try { //...some scary stuffs here } catch (BindException e){ if (e.getMessage

例如,类型为java.net.BindException的异常可以抛出“地址已在使用”(尝试绑定另一个程序使用的端口)或“权限被拒绝”(您没有根权限打开此端口号)。我不拥有抛出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();
        }

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

public class PermissionDeniedException
你甚至可以:

public class PermissionDeniedBindException extends BindException 
但是,如果这不是您的类,则您使用的库不希望您区分BindException,并且希望您在接收异常时以某种通用方式进行操作(即继续或始终重试),或者这是SDK中的问题。如果是后者,并且这个项目是开源的,我建议创建一个pull请求


否则,第三种选择当然是完全按照您正在做的做…但我不建议这样做,因为它非常脆弱,只需修改消息即可更改

如果您在代码的多个部分中执行此操作,那么我建议您将其取出并放置在它自己的类中,就像实用程序类一样;这只是这里的一个例子;但是tnx代表合作。当然,你可以在我的声明中概括一下另外,一些异常是使用null消息抛出的,所以假设不是这样是危险的。与
e.getMessage().contentEquals(“权限被拒绝”)
相比,使用空检查并像这样启动()更安全、更灵活:
e.getMessage()!=null&&e.getMessage().startsWith(“权限被拒绝”)
我不拥有引发这些异常的类。该类是java.net.ServerSocket。我认为你回答中提到的第三个选项听起来不错。。。如果库java.net没有改变任何东西,当然。除非你想修改java.net API,否则我认为你别无选择,只能继续你正在做的事情。你能做的最好的事情就是在你的代码库中把所有的东西都放在它们自己的位置上,使事情组织起来并保持一致。异常很难相互区分的事实表明ServerSocket的作者认为你可能不太关心你到底犯了什么错误。您将向用户提供相同的错误消息。就像很多节目一样。他们只是将信息输出给用户,我认为这是一个很好的反馈。