2016-11-04 89 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块就可以处理这些问题。

所以基本的规则:如果失败是例外,使用例外。否则使用返回值。