none
想override Exceptiion RRS feed

  • 問題

  • 前輩好

    目前我在實作API,會依據API的錯誤類型,拋出不同自定義的Exception

    例如:

     throw new Utility.ParameterException(string.Format("{0}參數不足", ParaArray[i]));

    或是

      throw new Utility.ParameterException(string.Format("參數錯誤:Status"));

    ParameterException是自定義的,結構如下:

    public class ParameterException : Exception {

    public ParameterException(string message) : base(message)

    {

    //邏輯

    ..

    } }


    但我的這種寫法會導致我Catch的地方會很長,

      catch (Utility.VerifyException vex)
                {
                    this.MyUtility.Rollback();
    
                    this.MyUtility.WriteLog(Mode.LogMode.ERROR, context, vex.ToString());
    
                    json = this.MyUtility.ReturnJson(ReturnCode.VerifyError, vex.Message, string.Empty);
                }
                catch (Utility.ParameterException pex)
                {
                    this.MyUtility.Rollback();
    
                    this.MyUtility.WriteLog(Mode.LogMode.ERROR, context, pex.ToString());
    
                    json = this.MyUtility.ReturnJson(ReturnCode.ParameterException, pex.Message, string.Empty);
                }
                catch (System.Exception ex)
                {
                    this.MyUtility.Rollback();
    
                    this.MyUtility.WriteLog(Mode.LogMode.ERROR, context, ex.ToString());
    
                    json = this.MyUtility.ReturnJson(ReturnCode.Extension, ex.Message, string.Empty);
                }

    裡面RetrnCode的定義:

    public enum ReturnCode { None = -1, Success = 0, VerifyError = 1, FileError = 2, DataError = 3, ParameterException = 998, Extension = 999 }

    原本沒特別想法,

    但最近學到泛型,想說是不是可以用泛型來處理

    變成只用一個ex來接,例如下

      catch (T ex)
      {
           this.MyUtility.Rollback();
    
           this.MyUtility.WriteLog(Mode.LogMode.ERROR, context, ex.ToString());
    
           json = this.MyUtility.ReturnJson(ReturnCode.Extension, ex.Message, string.Empty);
      }

    結果我不知道怎麼改成泛型寫法...

    不知不覺就變成別的寫法了,如下:

    流程:

    1. 新增一個returnCode的全域變數,

    throw new exception的時候,建構子再把接到的訊息給threw new exception出去,並且改變數returnCode的狀態

    public class FileException : Exception {

    //建構子

    public FileException(string message) : base(message) {

    //邏輯

    ... throw new Exception(message); } }

           

    //錯誤時,變更全域變數狀態

    returnCode = ReturnCode.ParameterException; throw new Utility.ParameterException(string.Format("{0}參數不足", ParaArray[i]));

    catch (System.Exception ex) { this.MyUtility.WriteLog(Mode.LogMode.ERROR, context, ex.ToString()); this._MyUtility.Rollback();

    json = this.MyUtility.ReturnJson(returnCode, ex.Message, string.Empty); }

    不知道前輩我這樣寫會有什麼問題嗎?

    或是有更好的改良法?

    其實是很希望能試著用泛型改寫,但我不知道如何起頭,卡在如何改寫Catch(Exception ex)變成Catch(T t),希望前輩能給點想法。

    謝謝

    2018年7月2日 上午 07:14

解答

所有回覆

  • 若對 Exception Class 有一些的瞭解的話

    可以參考 MSDN
    FaultException Class

    FaultException<TDetail> Class

    看是否可直接拿來用或參考其關係再自定 generic exception

    其他參考↓  (應該是你要的)
    .NET/C#: a generic exception class




    • 已標示為解答 HumorA 2018年7月2日 上午 08:38
    • 已編輯 ☜GEO☞ 2018年7月2日 上午 08:47
    2018年7月2日 上午 08:34
  • 我也有做這種類似作法,但和你不一樣的是,我用的是介面定義,然後 catch Exception,用 is 來判斷它是否有實作我定義的 Exception 介面,如果有就轉型它並取出它的資訊寫到 log,然後繼續其他例外處理 (當然沒實作的就依標準例外處理方式做)。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2018年7月2日 下午 02:03
    版主