[筆記] C# Windows 8 ,Windows Phone 8 開發,解決catch中無法使用await的替代方案。

  • 1087
  • 0
  • C#
  • 2015-06-10

一般我們在開發Windows Store App 、 Windows Phone 、其他應用程式時會使用try{} catch{}來確保某段程式碼發生例外情況時整個程式不會崩潰調,所以try{} catch{}是常常會用到的程式碼;隨著C#的演進非同步也越來越好寫只要利用async Tack await就可以創造非同步的方法,可是怎麼就無法將await的方法放在catch{}裡了呢?!

本篇文章將引導您學會catch中無法使用await的替代方案。

一般我們在開發Windows Store App 、 Windows Phone 、其他應用程式時會使用try{} catch{}來確保某段程式碼發生例外情況時整個程式不會崩潰調,所以try{} catch{}是常常會用到的程式碼;隨著C#的演進非同步也越來越好寫只要利用async Tack await就可以創造非同步的方法,可是怎麼就無法將await的方法放在catch{}裡了呢?!

 

本篇文章將引導您學會catch中無法使用await的替代方案。

若我們想要在想要再發生Exception例外狀況時執行await的方法時我們會這樣寫:

 

   1:  public async void Initial() {
   2:      string str = "qq";
   3:      try {
   4:          //該段程式碼無法將qq轉換為int整數,所以一定會發生catch
   5:          int i = int.Parse(str);
   6:   
   7:      }
   8:      catch {
   9:   
  10:          await GetInfo_1();
  11:      }
  12:  }



但是卻會發現這樣是不可行的

Visual Studio 會告訴你 [ Cannot await in the body of a catch clause. ],無法將await放在catch的底下。

 

1

 

該怎麼辦呢其實我們只要腦袋稍微轉個彎,就可以解決囉! 只是要多打幾行程式碼:

 

   1:  public async void Initial() {
   2:      string str = "qq";
   3:      bool isException = false;//自定義的bool變數用來判斷是否Exception
   4:      try {
   5:          //該段程式碼無法將qq轉換為int整數,所以一定會發生catch
   6:          int i = int.Parse(str);
   7:   
   8:      }
   9:   
  10:      catch {
  11:          isException = true;
  12:         
  13:      }
  14:      if (isException)
  15:      {
  16:          //若剛才發生Exception則執行await方法
  17:          await GetInfo_1();
  18:      }
  19:  }

 

自定義個bool的布林變數,若發生Catch時改變不林變數的值,try{} catch{}結束時再用if判斷是判斷是否有發生例外情況,再來做相對應的await方法

 

如此一來就學會了catch中無法使用await的替代方案囉!!

 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 !  感謝。

SUKI

HOLIESTAR