none
C# 自己建立 Event 做錯誤處理 RRS feed

  • 問題

  • 之前看到別人寫的 VB 程式

    他在自己寫的Class裡頭建立了自己的 ErrorEvent 事件

    當有程式錯誤時再用 RaiseEvent 觸發

    這樣使用這個Class的時候,就可以直接監聽 ErrorEvent 去處理Class 內發生的所有錯誤

    程式碼如下:

    Public Event ErrorEvent(ByVal Code As Integer, ByVal Message As String)

    錯誤發生時

    Try
        SQL.Open();
    Catch ex As Exception
        RaiseEvent ErrorEvent(-1, ex.Message)
    End Try


    像這樣的寫法在C#要怎麼去實現

    稍微耙文了一下有看到一些範例,但對委派跟事件不是很懂

    目前寫法是這樣,只是不確定這樣使用方式是對的嗎

    希望前輩們可以幫忙看一下

    宣告Event的委派

    public delegate void myDelegate(int Code, string Message);

    public event myDelegate ErrorEvent ;

    觸發Event事件

    try {
        SQL.Open();
    ErrorEvent(0, "SQL Connation OK!"); } catch (Exception ex) { ErrorEvent(-1, "PLC Connation Error:" + ex.Message); }

    2016年6月17日 上午 12:59

解答

  • 委派部份看起來沒問題,現在可以用 EventHandler 委派來簡化:

    public event EventHandler ErrorEvent; // 無參數

    不過事件的參數應該要繼承自 EventArgs 類別,然後用 EventHandler<TArgs> 委派來設定:

    public event EventHandler<ErrorEventArgs> ErrorEvent;

    另外就是成功的話不需要引發事件,成功時引發似乎是多此一舉。

    同時也應該要檢查 ErrorEvent 是否為 null,畢竟不是每個用戶端都會註冊 Event Handler。


    強力監督SQL Injection問題!!

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

    • 已標示為解答 open852134 2016年6月17日 上午 02:04
    2016年6月17日 上午 01:05
    版主

所有回覆

  • 委派部份看起來沒問題,現在可以用 EventHandler 委派來簡化:

    public event EventHandler ErrorEvent; // 無參數

    不過事件的參數應該要繼承自 EventArgs 類別,然後用 EventHandler<TArgs> 委派來設定:

    public event EventHandler<ErrorEventArgs> ErrorEvent;

    另外就是成功的話不需要引發事件,成功時引發似乎是多此一舉。

    同時也應該要檢查 ErrorEvent 是否為 null,畢竟不是每個用戶端都會註冊 Event Handler。


    強力監督SQL Injection問題!!

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

    • 已標示為解答 open852134 2016年6月17日 上午 02:04
    2016年6月17日 上午 01:05
    版主
  • 看起來沒有什麼問題, 但是這一行可以不需要:

    ErrorEvent(0, "SQL Connation OK!");

    2016年6月17日 上午 01:09
  • 感謝感謝

    自己對Event的用法還不是很董

    聽你這樣你講比較有方向耙文了!!

    成功也觸發是想說可以做個textbox來顯示目前操作的紀錄

    20160616 10:07:59 SQL Connation OK!
    20160616 10:10:30 SQL Connation Error!

    像這樣之類的~~

    2016年6月17日 上午 02:10
  • 你可以用 log 的方式來做這件事,事件是給外部有機會在特別情況處理相關動作或資料時使用。

    當然你也可以考慮設計一個 log 機制去聆聽這個事件,不過依個人經驗,這樣不會比較好做,所以直接在程式內使用 log 記錄會比較簡單。


    強力監督SQL Injection問題!!

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

    2016年6月17日 上午 02:37
    版主
  • 大大 我可以問一下

    public delegate void myDelegate(int Code, string Message);

    public event myDelegate ErrorEvent ;

    我這樣宣告使用沒問題 

    不過我發現把event 這個修飾詞拿掉 還是可以work

    event 這個修飾詞到底是什麼作用

    2016年6月22日 上午 05:00
  • 大大 我可以問一下

    public delegate void myDelegate(int Code, string Message);

    public event myDelegate ErrorEvent ;

    我這樣宣告使用沒問題 

    不過我發現把event 這個修飾詞拿掉 還是可以work

    event 這個修飾詞到底是什麼作用

    拿掉的意義就不一樣了, 變成以 MyDelegate  這個型別宣告一個以 ErrorEvent 為名稱的委派變數. (基本上因為 事件和委派有很強烈相關性, 所以用起來的感覺差不多)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年6月22日 上午 05:10
    版主