你寫的Try...Catch真的有必要么?


很多人喜歡用Try...Catch把每一個方法都包裹起來,可是真的有必要么?

為什么要這樣做?我估計是大家被BUG嚇怕了,生怕生產環境出現各種莫名其妙的錯誤,比如最經典的NullReferenceException,可問題是你用Try...Catch包裹起來后錯誤是不會爆出來了,但是執行結果是你想要的么?恐怕bug還在那里,只是經過你的Try...Catch之后,bug更加難找了,原本你用vs調試起來,直接就斷在了異常發生的地方,現在呢?你得一步步跟蹤過去。

這不是最主要的問題,最重要的問題是你在開發過程中隱藏了bug,如果當時你沒加這個Try...Catch,恐怕你早就發現這個bug了,因為程序壓根就跑不下去。

異常信息應該由最上層的框架捕獲,比如MVC中有ExceptionFilter,你可以在這里記錄詳細日志,別把黃頁拋給用戶就可以了。我想寫一個Try...Catch的場景,但是居然一下子想不出來一個很好的場景,因為真真需要寫Try...Catch的場景是很少的,你一旦想寫Try...Catch,首先想想你是不是在故意隱瞞Bug.

反而我鼓勵大家寫Throw exception,比如這種場景:

       public void Register(string userName,string password)
        {
            if(string.IsNullOrEmpty(userName))
                throw new InvalidDataException("user name can not be empty");
            if(string.IsNullOrEmpty(password))
                throw new InvalidDataException("password can not be empty");
            //....
        } 
        
        public void Register(string userName,string password)
        {
            try
            {
                //....
            }
            catch (Exception)
            {
                
            }
        }

理論上,雖然UI做了各種校驗,我們寫的Register任然保持對參數的不信任,繼續拋異常而不是Try..Catch,這樣你是不是能提前發現UI沒有校驗的bug呢?

 

 

追加內容:很多同學對此文的結論難以接受,最有疑問的就是“Try...catch可以記錄日志,捕獲異常的詳細信息,不會讓程序掛掉", 我需要重申的是:Try...Catch的作用不是用來記錄日志的,任何框架都在頂層提供了捕捉異常的方案(純類庫除外):

以.NET為例:

  1. Winform,可以:

    AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(UnhandledExceptionFunction);

  2. Asp.net,可以在Application_Error()方法里捕獲異常
  3. MVC,可以寫ExceptionFilter
  4. WebApi,可以寫ExceptionHandler

這里面拿到的Exception都是帶整個Stack記錄的,你可以用Log4記錄下來,並不是有的同學說的只會拿到e.message這樣

建議:少寫Try...Catch,喜歡寫Try...Catch的朋友注意:你那90%的Try...Catch都是在坑隊友


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM