尝试捕获块或布尔标志

本文关键字:布尔 标志 | 更新日期: 2023-09-27 18:16:27

我不确定我的代码,我想先保存到Blob Azure,如果它是成功的,然后保存到我的数据库url,我有两种方法来做到这一点。第一个使用名为flagboolean 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应该是一个更好的方法,但我想在这里确认:)

尝试捕获块或布尔标志

通常在这样的情况下,我将两者结合起来并创建一个方法来处理上传并根据上传是否成功或发生异常返回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();
}

一般来说,是否使用异常或返回值来指示函数是否成功取决于函数失败的几率。

异常处理是相当昂贵的,但如果它只在异常情况下使用,那么这应该不会导致性能问题。

异常处理的优点是它使你的代码看起来更干净,更容易理解,更容易维护和修改。

缺少指示操作是否成功的返回值,通常表示操作不成功是非常异常的情况。这与打开文件相反,例如,打开文件经常可能失败,因此使用返回值来报告失败。

您使用的所有三个函数,UploadFromStream, AddSave都不使用返回值表示成功(或者至少您认为不需要这些返回值),因此假设这些函数很少失败。

在这种情况下,我会使用exception方法。代码可以看起来更干净:
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块就会处理这些问题。

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