Atitit. 異常的使用總結最佳實務java .net php Vo8f,atititvo8f
Atitit.java 異常的使用總結最佳實務 Vo8f
1. 為什麼使用異常 1
2. 用throw拋出一個異常到catch子句中與通過函數調用傳遞一個參數兩者基本相同。 2
3. S E H的主要動機 2
4. RuntimeException跟checked Exception 2
5. 要不要使用checked Exception 3
6. Exception商務程序控制 可以借鑒一下) 3
7. checked Exception 的缺點 4
8. Base類and 擴充class 拋出的特別的異常不一樣的解決之道 4
9. checked Exception 轉換 re 4
10. 丟出新異常D,可以讓它從已有的異常中繼承, 4
11. 列舉最常用的五種RuntimeException: 5
12. 下面是JDK API中列出的異常類: 除了RuntimeException以外的,都是checked Exception 5
13. 參考 6
1. 為什麼使用異常
對C程式來說,使用Error Code就可以了,為什麼還要引入異常?因為異常不能被忽略。如果一個函數通過設定一個狀態變數或返回錯誤碼來表示一個異常狀態,沒有辦法保證函數調用者將一定檢測變數或測試錯誤碼。結果程式會從它遇到的異常狀態繼續運行,異常沒有被捕獲,程式立即會終止執行。
在C程式中,我們可以用int setjmp( jmp_buf env );和 void longjmp( jmp_buf env, int value );這2個函數來完成和異常處理相識的功能,但是MSDN中介紹了在C++中使用longjmp來調整stack時不能夠對局部的對象調用解構函式,但是對C++程式來說,解構函式是重要的(我就一般都把對象的Delete放在解構函式中)。 <br>所以我們需要一個方法:①能夠通知異常狀態,又不能忽略這個通知,②並且Searching the stack以便找到異常代碼時,③還要確保局部對象的解構函式被Call。而C++的異常處理剛好就是來解決這些問題的。</p> <p>有的地方只有用異常才能解決問題,比如說,在當前上下文環境中,無法捕捉或確定的錯誤類型,我們就得用一個異常拋出到更大的上下文環境當中去。還有,異常處理的使用呢,可以使出錯處理常式與“通常”代碼分離開來,使代碼更簡潔更靈活。另外就是程式必不可少的健壯性了,異常處理往往在其中扮演著重要的角色。</p>
因為當函數返回時局部對象總是被釋放,無論函數是如何退出的。(僅有一種例外就是當你調用longjmp時。Longjmp的這個缺點是C++率先支援異常處理的主要原因)
儘管C++首次引入異常的規範
儘管C++首次引入異常的規範,但是Java是強制實施"檢查的異常"(Checked Exception)規範的唯一的主流語言
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
2. 用throw拋出一個異常到catch子句中與通過函數調用傳遞一個參數兩者基本相同。
這裡面確有一些相同點,但是他們也存在著巨大的差異。</p> <p>讓我們先從相同點談起。你傳遞函數參數與異常的途徑可以是傳值、傳遞引用或傳遞指標,這是相同的。但是當你傳遞參數和異常時,系統所要完成的操作過程則是完全不同的。產生這個差異的原因是:你調用函數時,程式的控制權最終還會返回到函數的調用處,但是當你拋出一個異常時,控制權永遠不會回到拋出異常的地方。</p>
3. S E H的主要動機
微軟在Wi n d o w s中引入S E H的主要動機是為了便於作業系統本身的開發。作業系統的開發人員使用S E H,使得系統更加強壯。我們也可以使用S E H,使我們的自己的程式更加強壯。 <br>使用S E H所造成的負擔主要由編譯器來承擔,而不是由作業系統承擔。 <br>當異常塊(exception block)出現時,編譯器要產生特殊的代碼。編譯器必須產生一些表( t a b l e)來支援處理S E H的資料結構。 <br>編譯器還必須提供回調( c a l l b a c k)函數,作業系統可以調用這些函數,保證異常塊被處理。 <br>編譯器還要負責準備棧結構和其他內部資訊,供作業系統使用和參考。 <br>在編譯器中增加S E H支援不是一件容易的事。不同的編譯器廠商會以不同的方式實現S E H,這一點並不讓人感到奇怪。幸虧我們可以不必考慮編譯器的實現細節,而只使用編譯器的S E H功能。(其實大多數編譯器廠商都採用微軟建議的文法)
4. RuntimeException跟checked Exception
Java的Exception分為兩類,一類是RuntimeException及其子類,另外一類就是checked Exception。Java要求函數對沒有被catch處理掉的checked Exception,需要將其寫在函數的聲明部分
.net 只有RuntimeException
除了Error與RuntimeException,其他剩下的異常都是你需要關心的,而這些異常類統稱為Checked Exception,至於Error與RuntimeException則被統稱為Unchecked Exception.
5. 要不要使用checked Exception
要使用....優點是流程clr,and ide能自動產生結構代碼...
中建議在遇到可恢複的錯誤時採用checked異常,遇到不可恢複的異常時採用unchecked異常。
6. Exception商務程序控制 可以借鑒一下)
在使用UseCase來描述一個情境的時候,有一個主事件流和n個異常流。異常流可能發生在主事件流的過程,而try語句裡面實現的是主事件流,而 catch裡面實現的是異常流,在這裡Exception不代表程式出現了異常或者錯誤,Exception只是物件導向化的商務邏輯控制方法。如果沒有 明白這一點,那麼我認為並沒有真正明白應該怎麼使用Java來正確的編程。
而我自己寫的程式,會自訂大量的Exception類,所有這些Exception類都不意味著程式出現了異常或者錯誤,只是代表非主事件流的發生的, 用來進行那些分支流程的流程式控制制的。例如你往許可權系統中增加一個使用者,應該定義1個異常類,UserExistedException,拋出這個異常不代 表你插入動作失敗,只說明你碰到一個分支流程,留待後面的catch中來處理這個分支流程。傳統的程式員會寫一個if else來處理,而一個合格的OOP程式員應該有意識的使用try catch 方式來區分主事件流和n個分支流程的處理,通過try catch,而不是if else來從代碼上把不同的事件流隔離開來進行分別的代碼撰寫
7. checked Exception 的缺點
支援Unchecked異常:
沿調用棧向上傳播的Checked異常破壞了頂層的方法,因為這些方法必須聲明拋出所有它們調用的方法拋出的異常
Check異常的拋出作為方法介面的一部分,這使得添加或移除早期版本中方法的異常難以實現。
8. Base類and 擴充class 拋出的特別的異常不一樣的解決之道
可以在Base類的foo方法中加入拋出ExceptionB的聲明,然而,這樣就破壞了open-close原則。而且,有時我們沒有辦法去修改父類,比如當重載一個Jdk裡的類的時候。
另一個可能的做法是在Extend的foo方法中catch住ExceptionB,然後構造一個ExceptionA並拋出。這是個可行的辦法但也只是一個權宜之計。
9. checked Exception 轉換 re
為了避免在函式宣告中寫throws部分,在Java項目裡面常常可以看到以下代碼用來‘吞掉’Exception:
10. 丟出新異常D,可以讓它從已有的異常中繼承,
[iii] 在“The Design and Evolution of C++”, Bjarne Stroustrup也提到,同樣也基於對這個問題的考慮,c++沒有“Static Checking”(checked exceptions)而是採用“Run time Checking”。而且Stroustrup建議,對於丟出新異常D,可以讓它從已有的異常中繼承,這樣既不影響已有代碼,新的代碼也可以處理它。(這是Stroustrup在1990就作出的結論!)
11. 列舉最常用的五種RuntimeException:
這是JAVA認證考試中最常見的題目,事實上,runtime exception中最常見的,經常碰到的,也就5,6種,如下:
ArithmeticException |
int a=0; int b= 3/a; |
ClassCastException: |
Object x = new Integer(0); System.out.println((String)x); |
IndexOutOfBoundsException ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException |
int [] numbers = { 1, 2, 3 }; int sum = numbers[3]; |
IllegalArgumentException NumberFormatException |
int a = Interger.parseInt("test"); |
NullPointerExceptionextends |
|
· 除了RuntimeException,其他繼承自java.lang.Exception得異常統稱為Checked Exception,他們有多少種呢?
12. 下面是JDK API中列出的異常類:
除了RuntimeException以外的,都是checked Exception
java.lang.Object java.lang.Throwable java.lang.Exception 所有已實現的介面: Serializable 直接已知子類: AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException, BackingStoreException, BadAttributeValueExpException, BadBinaryOpValueExpException, BadLocationException, BadStringOperationException, BrokenBarrierException, CertificateException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, DatatypeConfigurationException, DestroyFailedException, ExecutionException, ExpandVetoException, FontFormatException, GeneralSecurityException, GSSException, IllegalAccessException, IllegalClassFormatException, InstantiationException, InterruptedException, IntrospectionException, InvalidApplicationException, InvalidMidiDataException, InvalidPreferencesFormatException, InvalidTargetObjectTypeException, InvocationTargetException, IOException, JAXBException, JMException, KeySelectorException, LastOwnerException, LineUnavailableException, MarshalException, MidiUnavailableException, MimeTypeParseException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NoSuchFieldException, NoSuchMethodException, NotBoundException, NotOwnerException, ParseException, ParserConfigurationException, PrinterException, PrintException, PrivilegedActionException, PropertyVetoException, RefreshFailedException, RemarshalException, RuntimeException, SAXException, ScriptException, ServerNotActiveException, SOAPException, SQLException, TimeoutException, TooManyListenersException, TransformerException, TransformException, UnmodifiableClassException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URIReferenceException, URISyntaxException, UserException, XAException, XMLParseException, XMLSignatureException, XMLStreamException, XPathException |
13. 參考
Anders Hejlsberg論為什麼不在c#引入類似java的checked exceptions - 產品和技術 - 賽迪網.htm
C++處理異常技巧.htm
[轉載]JAVA 的checked異常和unchecked異常_4527_新浪部落格.htm
php發展前景怎?會不會被Java或net替代?php相對應Java與net有什優勢?
發展前景還可以,不會被替代。相對於JAVA和.net有優勢有:簡單易學、容易部署、可以跨平台、適合小型網站的快速開發
PHP要想有發展就得奔著進階工程師去
問PHP與java NET 有什卻別,在就業上那個更好些
從學習角度上來說 Java是最不好學的,.net其次,PHP最好學....從web開發來看 PHP做的網站是最好用的,ASP.net的其次,Java的是最不好用的.....無論哪個學好了,都能找到份5000以上的工作...
PHP 學習 有一個黃金組合,那就是 PAML ,P:PHP A:Apache伺服器 M:MySQL資料庫 L:Linux作業系統,因為這四個都是免費的,所以PHP開發從某種意義講投資比較少,小公司一般用的比較挫...
ASP.net 是微軟的一套系統 要學習 C++ ASP 語言等等,因為我不是幹這個的,所以不大清楚..
接下來說說Java Java是物件導向的語言 做這行,首先你要學Java程式設計 ,學完以後想做Java web方向的開發,你還要學習好多知道 1:jsp servlet 必須精通 2:起碼要知道一種以上的資料庫 MySQL or oracle 或者其它的,3:html javascript 你得會,不然怎麼寫JSP頁面 4:tomcat WebLogic 你的會一種,不然你的程式運行在什麼地方...接下來你還要學習架構 比較有名的像SSH架構等等,反正學習的東西是很多的......起碼Java的設計模式你要知道點...其實就是因為Java的設計模式,往往把簡單的東西給弄複雜了....呵呵...它其實最要是做商務程序的...當然了Java可以做手機遊戲等方面的開發,不過這個我就不大清楚了....希望對你有協助吧....
總體來說,這三個哪個都比較好學 ....入門都比較簡單...但是要想精通了Java是最難的...PHP應該是最容易的,asp.net其次..就看樓主怎麼選擇了...至於就業方面,目前來說,這三個都比較熱門...不知道將來怎麼樣....
希望對樓主有協助吧,祝你學習順利....