2013-10-21 37 views
1

我有以下問題:如何處理異常而不退出循環?

我嘗試插入multiple employee data,但員工數據應插入只有一次,但如果我選擇多個員工,其中一人已經被之前插入,根據數據庫約束會拋出一個錯誤。

我的問題是(最佳實踐):如何處理此異常,我想繼續插入不重複的員工而不退出我的循環,因爲該異常。


protected void ibtn_save_detail_Click(object sender, ImageClickEventArgs e) 
     { 
      try 
      { 
       Fill_Form(); 
       RewardDetails obj = new RewardDetails(); 
       var collection = ddl_employees.CheckedItems; 
       for (int i = 0; i < collection.Count; i++) 
       { 
        obj.Emp_num = int.Parse(collection[i].Value); 
        obj.Req_ser = int.Parse(reqSer); 
        obj.Req_year = int.Parse(reqYear); 
        DataTable dt = Utilities.GetDep(obj.Emp_num); 
        obj.Main_code = int.Parse(dt.Rows[0]["dep_code"].ToString()); 
        obj.Year = int.Parse(dt.Rows[0]["dep_year"].ToString()); 
        obj.Dep_name = dt.Rows[0]["dep_name"].ToString(); 

        string res = obj.InsertReward();//exception in case of repetition . 

        if (!string.IsNullOrEmpty(res)) 
        { 

         div_detail_result.Visible = true; 
         SetMessage(""); 

        } 
        else 
        { 
         SetMessage("Adding the employee has been done :" + collection[i].Text.Trim()); 
        } 
       } 
       BindDetailsGV(obj.Req_ser, obj.Req_year); 
       ddl_employees.ClearCheckedItems(); 

      } 
      catch (Exception ee) 
      { 
       SetMessage("Error,this employee has been added before."); 
       ddl_employees.ClearCheckedItems(); 
      } 
     } 
+0

繼續使用; try&catch在循環內部 –

回答

1

移動你的try/catch只適用於obj.InsertReward();線。另外,不要抓住Exception,只是insertReward拋出的具體例外。

因此,代碼可能最終會是這樣的:

protected void ibtn_save_detail_Click(object sender, ImageClickEventArgs e) 
{ 
    Fill_Form(); 
    RewardDetails obj = new RewardDetails(); 
    var collection = ddl_employees.CheckedItems; 
    for (int i = 0; i < collection.Count; i++) 
    { 
     obj.Emp_num = int.Parse(collection[i].Value); 
     ... 

     string res; 
     try 
     { 
      res = obj.InsertReward(); 
      // stuff to do if added 
     } 
     catch (RewardExistsException) 
     { 
      // stuff to do if already exists 
     } 
    } 
} 
1

你應該把try內循環:

for (int i = 0; i < collection.Count; i++) 
{ 
    try 
      { 
       obj.Emp_num = int.Parse(collection[i].Value); 
       obj.Req_ser = int.Parse(reqSer); 
       obj.Req_year = int.Parse(reqYear); 
       DataTable dt = Utilities.GetDep(obj.Emp_num); 
       obj.Main_code = int.Parse(dt.Rows[0]["dep_code"].ToString()); 
       obj.Year = int.Parse(dt.Rows[0]["dep_year"].ToString()); 
       obj.Dep_name = dt.Rows[0]["dep_name"].ToString(); 

       string res = obj.InsertReward();//exception in case of repetition . 

       if (!string.IsNullOrEmpty(res)) 
       { 

        div_detail_result.Visible = true; 
        SetMessage(""); 

       } 
       else 
       { 
        SetMessage("Adding the employee has been done :" + collection[i].Text.Trim()); 
       } 
      } 
    catch (Exception ee) 
     { 
      // your exception code 
     } 
} 
1
try{ 
string res = obj.InsertReward(); 
} 
catch(Exception ex){ 
    continue; // or rethrow exception in some condions 
} 

而且不要忘記,灌裝過程中有可能是例外obj

1

確保你的try catch不封裝for循環 這樣:

try 
{ 
    for(...){} 
} 
catch(Exception){ } 

應該是:

for(...) 
{ 
    try{ } 
    Catch{ } 
} 

,或者如果異常沒有內部拋出循環簡單地抓住你開始循環或嘗試啓動循環前後。