尝试catch块或布尔标志?

时间:2016-11-04 00:24:11

标签: c# asp.net-mvc entity-framework

我不确定我的代码,我想首先保存到Blob Azure中,如果它成功,那么将该url保存到我的数据库中,我有两种方法可以做到这一点。第一个使用名为boolean variable的{​​{1}},如果flag值设置为true,那么我可以将其保存到我的数据库中,但我不确定此代码是否是最佳方法。是否可能由于某种原因文件未上传到flag,即使发生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(); 应该是更好的方法,但我想在此确认:)

2 个答案:

答案 0 :(得分:2)

通常情况就是这样,我去两者的组合并创建一个处理上传的方法,并根据上传是否成功或发生异常而返回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 :(得分: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
    }
}

现在你的代码看起来相当简单。您不必使用临时变量记住您的进度,如果出现任何问题,您的日志记录将会发生。请注意,如果在意外的位置抛出异常,例如在using语句末尾的Dispose出错时,甚至会出现这种情况!

此功能也可以更好地维护。如果你添加一个额外的函数,它也是非常特殊的失败,只需添加它,你的catch块将处理问题。

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