簡體   English   中英

Java 拋出異常(不是類轉換異常)

[英]Java casting an exception (not class cast exception)

當在 java 中捕獲異常時,是否有將異常轉換為新類型的用例? 或者是標准

    throw new DiffException(e)

做到這一點的唯一方法。 如果我忽略了一些東西,我很抱歉,但我得到的唯一搜索結果是“ClassCastExceptions”,這顯然不是我要找的

我相信你的意思是'exception wrapping' 沒有其他方法可以做到這一點 - 您使用構造函數創建一個新的Exception實例,該構造函數將另一個異常作為原因。 這要歸功於java.lang.Exception 的 1-arg 構造函數 自定義異常類型的典型實現(如您的DiffException )也聲明了這樣的 1-arg 構造函數。

好吧,如果趕上(例外e你的情況我想)是的一個亞型DiffException ,你當然可以它像

throw (DiffException) e;

但我懷疑這就是您想要做的,因為它沒有任何區別(即使在接收端, e仍將具有相同的運行時類型)。

所以答案很可能是,,沒有其他等效的方式來做

throw new DiffException(e);

而不是這樣做。

然而,應該注意的是,執行new DiffException(e)不稱為強制轉換,而是,包裝鏈接異常。

既然您提到了用例,Java 中的常見用例就是將已檢查的異常包裝為未檢查的; 當檢查異常不可能發生時,這是合適的,例如:

public static Reader getUTF8Reader(InputStream is) {
    try {
        return new InputStreamReader(inputStream, "UTF-8");
    } catch(UnsupportedEncodingException e) {
        // should never happen since UTF-8 is guaranteed to be available as per
        // http://download.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html
        throw new RuntimeException("UTF-8 not available", e);
    }
}

如果不包裝異常,您要么不得不吞下它(這感覺不對),要么將該方法聲明為throws UnsupportedEncodingException ,這會強制任何使用它的人捕獲永遠不會拋出的異常 包裝它,調用者沒有責任處理不太可能的情況,但我們受到保護,以防萬一將來某個晦澀的平台上無法使用 UTF-8。

如果我理解正確,這里就是我正在考慮的用例。 表達:

new FileInputStream("the path");

如果文件不存在,則可能拋出FileNotFoundException FileNotFoundException擴展了IOException ,因此您可以編寫如下代碼:

public void readFromFile(String path) {
    InputStream in = new FileInputStream(path);
    // do something....
}

現在您可以按如下方式調用此方法:

try {
    readFromFile("myFile");
} catch (IOException e) {
    if (e instanceof FileNotFoundException) {
        FileNotFoundException fnfe = (FileNotFoundException)e;
        // do something
    }
    // do something else
}

但我建議您為FileNotFoundExceptionIOException創建單獨的 catch 塊(至少對於這個用例):

try {
    readFromFile("myFile");
} catch (FileNotFoundException e) {
    // do something with FileNotFoundException
} catch (IOException e) {
    // do something with IOException
}

這段代碼不包含 instanceof、casting 和其他丑陋的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM