16.2.2 自定义异常

用户自定义异常通过扩展Exception类来创建。这种异常类可以包含一个“普通”类所包含的任何东西。

【实例16.6】下面就是一个用户定义异常类的例子,它包含一个构造函数、几个变量和方法。


01 public class One

02 {

03 public static void main(String str[]args)throws ServerTimedOutException

04 {

05 try

06 {

07 throw new ServerTimedOutException("Could not connect",80);

08 }

09 catch(ServerTimedOutException e)

10 {

11 System.out.println("异常信息是:"+e.toString());

12 }

13 }

14 }

15 class ServerTimedOutException extends Exception

16 {

17 private String reason;

18 private int port;

19 public ServerTimedOutException(String reason, int port)

20 {

21 this.reason=reason;

22 this.port=port;

23 }

24 public String getReason()

25 {

26 return reason;

27 }

28 public int getPort()

29 {

30 return port;

31 }

32 }


【代码说明】第15~32行自定义了一个异常类ServerTimedOutException,其继承自Exception类。第5~8行捕获异常信息,第9~12行处理异常信息。

【运行效果】


异常信息是:ServerTimedOutException


【实例16.7】考虑一个客户服务器程序。在客户代码中,要与服务器连接,并希望服务器在5秒内响应。如果服务器没有响应,代码就抛出一个异常(如一个用户定义的ServerTimedOutException),实现方法如下所示。


01 public void connectMe(String serverName)throws

02 ServerTimedOutException{

03 int success;

04 int portToConnect=80;

05 success=open(serverName, portToConnect);

06 if(success==-1){

07 throw new ServerTimedOutException(

08 "Could not connect",80);

09 }

10 }


要捕获异常,使用try语句:


11 public void findServer()

12 {

13 try{

14 connectMe(defaultServer);

15 }catch(ServerTimedOutException e){

16 System.out.println("Server timed out, trying alternate");

17 try{

18 connectMe(alternateServer);

19 }catch(ServerTimedOutException e1)

20 {

21 System.out.println("No server currently available");

22 }

23 }


【代码说明】上述代码并不完整,只是给出了部分代码,包括第2行的异常声明,第13~22行的捕获异常和处理异常。读者可根据上一个实例的实现方法,实现这个实例。

也可部分地处理一个异常,然后将其抛出。如:


try{

……

}catch(ServerTimedOutException e){

System.out.println("Error caught");

throw e;

}