python try catch 能知道是哪一行代码_能导致3.7亿美元损失的异常,到底是怎么回事?...
1996年6月,阿麗亞娜5號火箭進行了第一次發射。火箭發射后37秒自毀,導致任務失敗,損失約3.7億美元。故障調查小組最終發現,是由數據轉換而導致整數溢出造成的異常。由此看來,提前預判出異常并進行處理對于系統的正常運行是多么重要。
不管是小白還是大神,異常總是程序員無法避免的一個話題。尤其是剛入門編程的程序員,一出現異常就不知道如何應對,非常容易慌亂。
那么什么時候才會出現異常呢?只有在當前的環境下程序無法正常運行下去,程序已經無法來正確解決問題了,異常才會從當前環境中跳出來。在實際編程中,異常出現的情形總是不期而至:文件不存在或者格式不對、網絡連接失敗、內存或硬盤滿了等等。
一、異常的體系
首先我們可以明確一點,就是異常的處理機制可以確保我們程序的健壯性,提高系統可用率。雖然我們不是特別喜歡看到它,但是我們不能不承認它的地位和作用。接下來,我們先通過一張圖來了解下Java異常的體系結構。
從上面這幅圖可以看出,Java標準庫內建了一些通用的異常,Throwable是這些類的頂層父類。Throwable又派生出Error和Exception。
Error及其子類代表非程序異常,不能被程序員通過代碼處理。由于Error一般是系統性的錯誤,當出現這些異常時,Java虛擬機(JVM)一般會選擇終止線程,所以程序員不用試圖去捕獲Error引發的異常狀況。
Exception及其子類代表程序本身可以捕獲并且可以處理的異常。可以被Java異常處理機制使用,是異常處理的核心。根據編譯器對異常的檢查情況,又將Exception的子類分為運行時異常(RuntimeException)和編譯期異常(CheckedException)。
運行時異常:在編譯期不會提示和發現這樣的異常,這樣的異常發生的原因多半是代碼寫的有問題,比如:使用了空對象而引發的NullPointerException。對于RuntimeException這樣的異常,我們應該修正代碼來進行處理。
編譯期異常:都是可以在編譯階段被處理的異常,比如:可能會產生I/O錯誤時的IOException。Java認為CheckedException都是可以在編譯階段被處理的異常,所以程序會強制要求預先處理所有的CheckedException,否則編譯不會通過。
二、異常的處理
編程語言覺得盡量在程序員犯錯的時候“惡心”一下程序員,“逼著”他們去處理異常。Java異常的處理主要依賴于try、catch、finally、throws、throw這五個關鍵字,一般來說我們會使用try…catch…finally語句塊進行異常處理,或者在方法簽名中使用throws 聲明,“不負責任的”的讓方法調用者自己去解決。
1.異常“終結者”try,catch
使用try-catch語句塊可以捕獲異常并進行處理,try-catch-finally的常規語法如下:
try{//可能會出現異常的程序代碼
語句1;
語句2;
語句3;
}catch(異常類型 e) {
//捕獲并處理異常或者使用throw拋出異常
}finally{
//必執行的代碼
}
語句4;
語句5;
當try代碼塊中沒有出現異常時:try語句塊中的語句逐一被執行,程序將跳過catch語句塊,執行finally語句塊和其后的語句。
當try代碼塊中出現異常時:try語句塊中的異常語句之后的代碼將被忽略,程序將直接跳到catch語句塊。
如果catch語句塊中捕獲到了異常進行處理,會在catch語句塊執行后接著執行finally語句塊和其后的語句。如果沒有捕獲到異常或者使用throw拋出了異常,在catch語句塊執行后接著只會執行finally語句塊,但finally語句塊后的語句不會被執行。
2.“不負責任”的throws
throws是另一種處理異常的方式。如果方法內沒有捕獲和處理異常,而是通過throw拋出了編譯期異常,那么必須通過throws進行聲明。throws運用于方法聲明之上,表示當前方法不處理異常,而是提醒該方法的調用者來處理異常。
聲明異常格式如下:
修飾符 返回值類型 方法名(參數)throws異常類名1,異常類名2…{采取這種異常處理的原因可能是:方法本身不知道如何處理這樣的異常,或者說讓調用者處理更好,調用者需要為可能發生的異常負責。
3.自定義異常
在復雜業務環境下,Java自帶的異常可能滿足不了我們業務的需求,這個時候我們可以自定義異常來進行對業務異常的處理。自定義異常都應該繼承Exception基類,如果希望自定義運行時異常,則應該繼承RuntimeException。
定義自定義異常時通常需要提供2種構造器:一個是無參數的構造器;另一個是帶一個字符串參數的構造器,這個字符串將作為該異常對象的詳細說明。語法格式如下:
public class Register Exception extends Runtime Exception {/*** 空參構造 */
public Register Exception() {
} /**** @param message 表示異常提示 */
public Registe rException(String message) {
super(message);
}
}
作為一名合格的程序員,我們不僅需要學會如何挑選格子襯衫,還需要在瘋狂的coding中鍛煉出更多的肌肉,以便隨時應對前來改需求的產品經理,更重要的就是要做到對常見異常有一些印象,在真正遇到時知道去哪找API并且優雅的處理掉異常。
總結
以上是生活随笔為你收集整理的python try catch 能知道是哪一行代码_能导致3.7亿美元损失的异常,到底是怎么回事?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: onenote复制出来是图片_你真的了解
- 下一篇: 去除覆盖在文字上的水印_PDF文档密码移