我們可創建一個控制器,令其捕獲所有類型的違例。具體的做法是捕獲基礎類違例類型Exception(也存在其他類型的基礎違例,但Exception是適用於幾乎所有編程活動的基礎)。如下所示:
catch(Exception e) {
System.out.println("caught an exception");
}
這段代碼能捕獲任何違例,所以在實際使用時最好將其置於控制器列表的末尾,防止跟隨在後面的任何特殊違例控制器失效。
對於程序員常用的所有違例類來說,由於Exception類是它們的基礎,所以我們不會獲得關於違例太多的信息,但可調用來自它的基礎類Throwable的方法:
String getMessage()
獲得詳細的消息。
String toString()
返回對Throwable的一段簡要說明,其中包括詳細的消息(如果有的話)。
void printStackTrace()
void printStackTrace(PrintStream)
打印出Throwable和Throwable的調用堆棧路徑。調用堆棧顯示出將我們帶到違例發生地點的方法調用的順序。
第一個版本會打印出標准錯誤,第二個則打印出我們的選擇流程。若在Windows下工作,就不能重定向標准錯誤。因此,我們一般願意使用第二個版本,並將結果送給System.out;這樣一來,輸出就可重定向到我們希望的任何路徑。
除此以外,我們還可從Throwable的基礎類Object(所有對象的基礎類型)獲得另外一些方法。對於違例控制來說,其中一個可能有用的是getClass(),它的作用是返回一個對象,用它代表這個對象的類。我們可依次用getName()或toString()查詢這個Class類的名字。亦可對Class對象進行一些復雜的操作,盡管那些操作在違例控制中是不必要的。本章稍後還會詳細講述Class對象。
下面是一個特殊的例子,它展示了Exception方法的使用(若執行該程序遇到困難,請參考第3章3.1.2小節“賦值”):
//: ExceptionMethods.java // Demonstrating the Exception Methods package c09; public class ExceptionMethods { public static void main(String[] args) { try { throw new Exception("Here's my Exception"); } catch(Exception e) { System.out.println("Caught Exception"); System.out.println( "e.getMessage(): " + e.getMessage()); System.out.println( "e.toString(): " + e.toString()); System.out.println("e.printStackTrace():"); e.printStackTrace(); } } } ///:~
該程序輸出如下:
Caught Exception e.getMessage(): Here's my Exception e.toString(): java.lang.Exception: Here's my Exception e.printStackTrace(): java.lang.Exception: Here's my Exception at ExceptionMethods.main
可以看到,該方法連續提供了大量信息——每類信息都是前一類信息的一個子集。