2016-11-04 84 views
2

我不確定我的代碼,我想首先保存到Blob Azure中,如果它成功,然後將該URL保存到我的數據庫中,我有兩種方法可以執行此操作。第一個使用boolean variable的名稱爲flag,如果flag的值設置爲true,那麼我可以將它保存到我的數據庫中,但我不確定此代碼是否是最佳方法。有沒有可能是由於某種原因,文件沒有上傳到Blob,甚至如果出現這種情況flag值設置爲true:使用 第一種方法boolean flag variable嘗試catch塊或布爾標誌?

using (Stream fileStream = file.InputStream) 
{ 
    blockBlob.UploadFromStream(fileStream); 
    flag = true; 
} 

if (flag == true) 
{ 
    Urls.Add(blockBlob.SnapshotQualifiedUri.ToString()); 
    db.Save(); 
} 

還是應該有更好的方式來使用try catch塊?

try 
{ 
    using (Stream fileStream = file.InputStream) 
    { 
     blockBlob.UploadFromStream(fileStream); 
    } 
} 
catch(Exception) 
{ 
//do something 
} 

Urls.Add(blockBlob.SnapshotQualifiedUri.ToString()); 
db.Save(); 

請在你的答案解釋每一種方法之間的區別,我個人認爲,一個try catch應該是一個更好的辦法,但我想在這裏證實:)

+1

'flag'將始終設置爲true,除非它引發異常(如果它失敗,則認爲它會執行此操作)。所以在我看來,該標誌不會做任何事情,因爲下面的代碼不會執行。爲什麼不在'UploadFromStream'之後立即加入'Add'和'Save',並將其全部封裝在try/catch中? – Rob

+2

如果'UploadFromStream()'拋出一個異常,'flag'的值永遠不會被設置爲'true'(該方法在可以設置之前退出) –

回答

2

通常incases這個樣子,我走了兩者結合並創建一個處理上傳的方法,並根據上傳是否成功或發生異常返回true或false。

try catch允許任何潛在的異常處理得當,並且該標誌只是一個指示器,用於通知您該過程是否成功。

例如,對於您的上傳代碼,我將創建一個擴展方法是這樣的:

public static bool TryUploadFile(this CloudBlockBlob blockBlob, File file) 
    try 
    { 
     using (Stream fileStream = file.InputStream) 
     { 
      blockBlob.UploadFromStream(fileStream); 
     } 

     return true; 
    } 
    catch(Exception) 
    { 
     //do some logging or other error handling 
    } 

    return false; 
} 

,然後調用方法,像這樣:

bool succeeded = blockBlob.TryUploadFile(file); 

if (succeeded) 
{ 
    Urls.Add(blockBlob.SnapshotQualifiedUri.ToString()); 
    db.Save(); 
} 
1

一般來說,有關是否使用決策異常或指示函數是否成功的返回值取決於函數失敗的可能性。

異常處理相當昂貴,但如果僅在特殊情況下使用,則不會導致性能問題。

異常處理的優點是它使您的代碼看起來更乾淨,更好理解並更易於維護和更改。

缺少一個表示操作是否成功的返回值通常表示操作不成功是非常特殊的。這與例如打開一個文件相反,該文件通常可能會失敗,因此使用返回值來報告失敗。

全部三種功能使用,UploadFromStreamAddSave不使用指示返回值成功(或者至少你不認爲你需要這些返回值),因此假定這些功能很少失敗。

在這種情況下,我會使用異常方法。該代碼可能會看起來更清潔:

public void Upload(...) 
{ 
    try 
    { 
     using (Stream fileStream = file.InputStream) 
     { 
      blockBlob.UploadFromStream(fileStream); 
     } 
     Urls.Add(blockBlob.SnapshotQualifiedUri.ToString()); 
     db.Save(); 
    } 
    catch(Exception exc) 
    { 
     ProcessProblem(exc); 
     throw new MyUploadException(..., exc); 
     // or just throw exc 
    } 
} 

現在你的代碼看起來相當簡單。您不必使用臨時變量記住進度,如果出現任何問題,您的記錄將會發生。請注意,如果在意外的地方拋出異常,就會發生這種情況,就像使用聲明結尾處的Dispose出錯一樣!

這個功能也是更好的可維護性。如果你添加了一個額外的函數,在它失敗的情況下也是非常特殊的,只需添加它,你的catch塊就可以處理這些問題。

所以基本的規則:如果失敗是例外,使用例外。否則使用返回值。