2010-04-24 32 views
-1

我正在C#中創建擴展方法以從datagridview中檢索某個值。 這裏如果用戶給出的列名不存在,那麼我想讓這個函數拋出一個異常,這個異常可以在這個函數被調用的地方處理。 我怎樣才能做到這一點。如何爲自定義控件或擴展方法創建自定義異常處理程序

public static T Value<T>(this DataGridView dgv, int RowNo, string ColName) 
    { 
      if (!dgv.Columns.Contains(ColName)) 
       throw new ArgumentException("Column Name " + ColName + " doesnot exists in DataGridView."); 
      return (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T)); 
    } 

回答

1

難以理解你的問題,但它聽起來像是你想拋出一個異常,並在你稱之爲擴展方法的地方處理它。如果是這樣,你幾乎在那裏。您已經拋出異常,只需在調用點周圍放置一個try/catch塊。

public static T Value<T>(this DataGridView dgv, int RowNo, string ColName) 
{ 
    if (!dgv.Columns.Contains(ColName)) 
     throw new ArgumentException("Column Name " + ColName + " doesnot exists in DataGridView."); 
    return (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T)); 
} 

// Wherever you call the method: 
try 
{ 
    dataGridView.Value(rowNumber, columnName); 
} 
catch (ArgumentException) 
{ 
    // caught the exception 
} 

這是你在找什麼?

+0

@Zach:你明白我的意思。但我在這裏有點困惑。假設我爲此創建了一個程序集,然後將其包含到其他項目中。我不使用任何異常處理程序,然後發生異常的地方?我的意思是在我的dll或用戶代碼中。我感覺好像我的dll會掛在那一點上。而使用dll的用戶會陷入困境,他的所有應用程序將會異常關閉。是這樣嗎 ? – 2010-04-24 07:07:35

+1

@Shantanu:只要你讓你的自定義異常類爲public,你的其他項目將能夠捕獲你拋出的自定義異常。如果沒有,另一個項目會崩潰(除非它捕獲所有'Exception's,但這樣做被認爲是不好的做法)。 – 2010-04-24 07:16:34

2

這不是正確的做法。首先,用戶輸錯某些東西沒有任何特殊之處。其次,這種擴展方法可能會被深深地嵌入某種與數據庫協同工作的代碼中。你趕上例外,因爲打字錯誤是正常的。但是你現在也有編寫異常處理程序的負擔和一堆可以正確恢復程序狀態的代碼。

驗證用戶輸入應該儘早發生,然後才能啓動難以停止的一系列代碼。沒有理由在用戶輸入驗證中使用異常,一個簡單的if()語句可以完成工作。

您現在可以保留throw語句,如果您願意,它確實可以提供更好的診斷。但是你永遠不應該處理這個異常,因爲它現在可以診斷代碼中的一個錯誤。你不能用catch子句修正錯誤。

0

雖然問題已經解答,但我只是建議第二個解決方案。 拋出異常的想法應該是最後的選擇。您可以使用以下方法實現相同。 PS:我沒有在編輯器上輸入這段代碼,所以請原諒我的錯誤。