Это - плохо стиль программирования, чтобы иметь сингл, возможно, общее, универсальное исключение?

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

try
{
  DirectoryInfo dirInfo = new DirectoryInfo(someString); 
 //I don't know if that directory exists
 //I don't know if that string is valid path string... it could be anything

 //Some operations here
}
catch(Exception iDontCareWhyItFailed)
{
  //Didn't work? great... we will say: somethings wrong, try again/next one
}

Конечно, я, вероятно, мог сделать проверки, чтобы видеть, является ли строка допустимым путем (regex), то я проверил бы, существует ли каталог, то я мог поймать различные исключения для наблюдения, почему моя неудавшаяся стандартная программа и дает больше информации... Но в моей программе это не действительно необходимо. Теперь я просто действительно должен знать, приемлемо ли это, и что про говорило бы/думало бы об этом. Большое спасибо за внимание.

8
задан BalusC 6 April 2010 в 23:09
поделиться

8 ответов

Если вас действительно не волнует , почему произошел сбой, и ваша программа не может ничего сделать для восстановления, тогда можно делать что-то подобное; Я бы предпочел сохранить что-то подобное, чем код, который использует 3 блока try / catch, чтобы делать то же самое, но без добавления какого-либо дополнительного значения. Мне нравится имя исключения, которое сообщает, что оно не имеет значения, это лучше, чем перехватить переменную с именем ex .

Некоторые предложения, однако:

  1. Если вы собираетесь «поймать и игнорировать», уточните, какие типы исключений можно игнорировать . Если вы знаете, что можете игнорировать FileNotFoundException или любой класс IOException , просто поймите это.

  2. Если вы собираетесь перехватить общее исключение, подумайте о том, чтобы записать исключение где-нибудь . Ваш текущий подход может стать кошмаром для обслуживания, если в вашем блоке попытки существует логический дефект. Например, предположим, что вы кодируете единичную ошибку в отношении индекса массива ... ваш текущий код поглотит это и не даст никаких указаний на то, что произошло что-то более важное, чем «каталог не существует».

2
ответ дан 5 December 2019 в 07:34
поделиться
  • пишут "основной" код для обработки ожидаемых случаев.
  • написать код обработки исключений , чтобы ... ждать его ... обрабатывать исключительные случаи . Вот почему это называется «кодом обработки исключений». : -)

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

13
ответ дан 5 December 2019 в 07:34
поделиться

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

Выполнение проверок пути и других проверок не обязательно устраняет необходимость обработки исключений и блоков try. Исключения происходят постоянно (каталог не существует, сеть не подключена) это неожиданные, непредвиденные исключения, для обработки которых предназначены блоки try / catch.

0
ответ дан 5 December 2019 в 07:34
поделиться

Это действительно зависит от того, как вы собираетесь обрабатывать любую из этих ошибок.

Если в любом случае вы собираетесь выйти и просто распечатать Exception, и ваши пользователи знакомы с чтением и пониманием такого рода вывода, тогда все в порядке, и вы будете тратить время и код для его обработки. более конкретно.

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

И если ваши пользователи не являются «технарями» и будут нуждаться в более полезных сообщениях об ошибках, чем дампы исключений, то вам следует самостоятельно выполнить дополнительную обработку ошибок. Даже если они технари, они, вероятно, оценят более четкие сообщения об ошибках.

Нет правильного ответа. Это действительно зависит от вашего целевого пользовательского опыта.

1
ответ дан 5 December 2019 в 07:34
поделиться

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

5
ответ дан 5 December 2019 в 07:34
поделиться

Я бы не рекомендовал универсальный обработчик исключений. Вместо этого вам следует найти DirectoryInfo и типы исключений, которые он может генерировать. Затем вы должны попытаться избежать как можно большего числа, прежде чем вызывать конструктор, и перехватить только те исключения, которые вы ожидаете. Итак, мой код будет выглядеть так:

try
{
    if ( string.IsNullOrEmpty( someString ) )
        //do something or throw an exception
    if ( someString.Length > 248 )
        //do something or throw an exception

    DirectoryInfo dirInfo = new DirectoryInfo(someString); 

    If ( !dirInfo.Exists )
        //do something or throw an exception

    //path exists and is valid
    //Some operations here
}
catch(SecurityException)
{
  //Didn't work? great... we will say: somethings wrong, try again/next one
}
catch(ArgumentException)
{
  //Didn't work? great... we will say: somethings wrong, try again/next one
}
1
ответ дан 5 December 2019 в 07:34
поделиться

Я тоже виноват в такого рода ленивом кодировании, обычно при доставке быстрых изменений в «горячие» функции. Проблема в том, что очистка ленивого кода становится низким приоритетом, учитывая новый стек неизбежно «горячих» запросов функций, а это означает, что этот вид ленивого кода накапливается. Эти ленивые блоки перехвата исключений затем приводят к перехвату действительно неожиданных проблем, и внезапно состояние вашего приложения неожиданно изменилось. Я приучаю себя не делать этого, потому что написание ленивого кода похоже на использование кредитной карты. Это позволяет вам доставить сейчас то, что вам пришлось бы доставить позже, но именно сложность дает вам, когда пришло время расплачиваться за это.

0
ответ дан 5 December 2019 в 07:34
поделиться

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

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

Не беспокойтесь о стоимости исключений. По сравнению со стоимостью выполнения операций ввода-вывода стоимость исключения ничтожна.

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

0
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: