Есть ли более короткий способ игнорировать ошибку?
это мой код
Try
Directory.Delete(FolderName, True)
Catch
End Try
Он просто пытается удалить папку, если она существует. Если он не увидит папку, произойдет ошибка, которую я пытаюсь игнорировать. Он занимает место и затрудняет прокрутку кода.
Я использовал On Error Resume Next
, но, похоже, он игнорирует все ошибки в методе, и похоже, что я использую его неправильно.
Было бы полезно, если бы кто-нибудь рассказал более короткий способ попытки удалить каталог, не беспокоясь об исключениях null/directory not found
Спасибо!
Исключение является исключительным, то есть этого не должно происходить, но Try..Catch
предназначен для обработки этих исключительных случаев. Исключения не должны быть встроены в логику, когда это возможно. При этом, если бы все так кодировали, то FileNotFoundException был бы не нужен, но тем не менее он у нас есть.
Я бы создал метод и назвал его там, где вы хотите попытаться удалить папку. Таким образом, у вас всегда будет только одна линия.
Sub TryDeleteFolder(folderName As String)
Try
Directory.Delete(folderName, True)
Catch
End Try
End Sub
Для меня «Попробовать» означает, что он вернет результат в случае успеха (см., например, TryParse
и TryGetValue
в .NET Framework). Я использую что-то вроде «выстрелил и забыл», если мне все равно, удастся ли это.
Я всегда кодирую с целью предотвращения ошибок, поэтому я бы написал это как
If Directory.Exists(folderName) Then
Directory.Delete(folderName, True)
End If
Тем не менее, я призываю вас избавиться от позиции «игнорировать ошибки». Вместо этого используйте обработку исключений с помощью Try/Catch/End Try
, так как это, наконец, позволяет вам специально обрабатывать строки кода, подверженные ошибкам, что было кошмаром в старом VB6.
IDE также обеспечивает свертывание кода для блоков Try/Catch/End Try
, поэтому, если вы чувствуете, что они занимают слишком много места, сверните их!
Это то, что я ищу! Try Catch — это бельмо на глазу для однострочных кодов, особенно если это тот, который вам нужен. «Я всегда пишу код с целью предотвращения ошибок» Я буду иметь это в виду. Спасибо!
Существование каталога не означает автоматически, что его можно удалить (разрешения, блокировки файлов и т. д.). Это все еще может вызвать исключение.
Кроме того, существование каталога во время его проверки не гарантирует его дальнейшего существования в то время, когда вы пытаетесь его удалить. В некоторых случаях это может привести к лучшему пользовательскому опыту, чтобы сначала протестировать, но состояние гонки в основном означает, что вам всегда нужно иметь обработку ошибок при файловых операциях.
@dbasnett: Не знаю, почему вы изменили If Directory.Exists(folderName) = True
на If Directory.Exists(folderName)
. Конечно, технически это одно и то же, но я всегда предпочитаю быть явным/"откровенным" в своем коде, чтобы было немного изменений, которые я или кто-то еще может сделать ложным предположением о том, что делает строка кода.
@HelO'Ween Единственное, что может появиться между If и Then, - это логическое значение, так какое еще предположение можно сделать?
Классический способ вернуться от
On Error Resume Next
— использоватьOn Error GoTo 0
. Я не думаю, что это принесет большую пользу... это экономит только одну строку, и это очень устаревший стиль кодирования. Я бы не ожидал, что у вас будет много реплик, подобных этой, где вы хотите эффективно выстрелить и забыть. Я не думаю, что это плохо, если они выделяются необычностью, потому что они должно быть необычны.