2016-11-04 6 views
2

Я не уверен в моем коде, я хочу сначала сохранить в Blob Azure, и если он был успешным, сохраните этот url в моей базе данных, у меня есть два способа сделать это. Первый с использованием boolean variable с именем flag, если значение 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» и обернуть все это в try/catch? – Rob

+2

Если 'UploadFromStream()' выбрало исключение, значение 'flag' никогда не будет установлено в' true' (метод выходит до его установки) –

ответ

2

Обычно incases, как это я пойти сочетание двух и создать метод, который обрабатывает загрузку и возвращает true или false в зависимости от успешности загрузки или возникновения исключения.

Уловка try позволяет использовать любые возможные исключения для правильного обращения, а флаг становится просто индикатором, информирующим вас о том, был ли этот процесс успешным или нет.

Например, для кода загрузки, я хотел бы создать метод расширения, как это:

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

Как правило, решение о том, следует ли использовать исключения или возвращаемое значение, указывающее, будет ли функция успешной, зависит от вероятности отказа функции.

Обработка исключений довольно дорога, но если она используется только в исключительных случаях, это не должно приводить к проблемам с производительностью.

Преимущество обработки исключений заключается в том, что он делает ваш код более чистым, лучше понимаемым и более простым в обслуживании и изменении.

Отсутствие возвращаемого значения, указывающее, было ли действие успешным или нет, обычно дает указание, что совершенно исключено, что действие не выполняется. Это, вопреки, например, открытию файла, который довольно часто может быть неудачным и, таким образом, использует возвращаемое значение для сообщения об ошибке.

Все три функции, которые вы используете, UploadFromStream, Add и 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 
    } 
} 

Теперь ваш код выглядит довольно просто. Вам не нужно помнить о своем прогрессе с использованием временных переменных, и если что-то пойдет не так, произойдет ваше ведение журнала.Обратите внимание, что это будет даже в случае, если исключение выбрасывается в неожиданные места, например, когда Dispose в конце вашего заявления использования ошибочен!

Эта функция также удобна для обслуживания. Если вы добавите дополнительную функцию, в которой она также является исключительной, что она терпит неудачу, просто добавьте ее, и ваш блок catch обработает проблемы.

Итак, основное правило: если отказ является исключительным, используйте исключения. В противном случае используйте возвращаемые значения.

Смежные вопросы