2016-11-04 7 views
2

私は自分のコードについてはわかりませんが、最初にBlob Azureに保存しておき、それが正常にデータベースに保存されたら、私はこれを行う2つの方法があります。最初の1つはというboolean variableという名前を使用していますが、flagの値がtrueに設定されている場合はデータベースに保存できますが、このコードが最善のアプローチかどうかはわかりません。それが何らかの理由でファイルがBlobにアップロードされていないと、それが発生してもflag値がtrueに設定されている可能性があり:?boolean flag variableを使用して 最初のアプローチ:キャッチブロックまたはブール値フラグを試しますか?

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

使用するかどうかについての決定を関数が成功するかどうかを示す例外または戻り値は、関数の失敗の可能性によって決まります。

例外処理はかなり高価ですが、例外的な場合にのみ使用される場合は、パフォーマンス上の問題が発生しません。

例外処理の利点は、コードの外観をよりクリーンに、理解しやすく、保守しやすく、変更しやすくすることです。

アクションが成功したかどうかを示す戻り値がないため、通常、アクションが成功しないことは非常に例外的です。これは、例えば、ファイルを開く場合とは異なり、非常に頻繁に失敗する可能性があり、したがって、失敗を報告するために戻り値を使用します。

すべての3つのあなたが使用する関数、UploadFromStreamAdd、およびSaveは、成功を示す戻り値を使用していない(あるいは、少なくとも、あなたがこれらの戻り値を必要としないと思う)、これらの機能はほとんど失敗しないものとします。

このような場合は、例外メソッドを使用します。コードは非常にきれいに見えることができます:

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 
    } 
} 

は今、あなたのコードはかなり簡単になります。一時変数を使用して進捗状況を覚えておく必要はなく、何か問題が生じた場合は、ログが記録されます。これは、たとえあなたのusingステートメントの最後にDisposeが間違っているような、予期しない場所で例外がスローされた場合でもそうです!

この機能も優れた保守性があります。余分な関数を追加して、それが失敗するという例外的な例外がある場合は、それを追加するだけでcatchブロックが問題を処理します。

したがって、基本的なルール:障害が例外的である場合は、例外を使用します。それ以外の場合は戻り値を使用します。

関連する問題