Каково еще преимущество использования попытки {} выгода {} по сравнению с если {} {}

У меня была эта проблема и она была решена так:

def write_xml_file (self, file, xml_root_element, xml_declaration=False, pretty_print=False, encoding='unicode', indent='\t'):
    pretty_printed_xml = etree.tostring(xml_root_element, xml_declaration=xml_declaration, pretty_print=pretty_print, encoding=encoding)
    if pretty_print: pretty_printed_xml = pretty_printed_xml.replace('  ', indent)
    file.write(pretty_printed_xml)

В моем коде этот метод называется следующим:

try:
    with open(file_path, 'w') as file:
        file.write('<?xml version="1.0" encoding="utf-8" ?>')

        # create some xml content using etree ...

        xml_parser = XMLParser()
        xml_parser.write_xml_file(file, xml_root, xml_declaration=False, pretty_print=True, encoding='unicode', indent='\t')

except IOError:
    print("Error while writing in log file!")

Это работает только потому, что по умолчанию использует two spaces в отступе, который не находит особого подчеркивания отступа и, следовательно, не очень. Я не мог указывать какие-либо настройки для etree или параметра для любой функции, чтобы изменить стандартный отступ epree. Мне нравится, как легко использовать etree, но это меня действительно раздражало.

58
задан jeroen 16 March 2009 в 18:31
поделиться

11 ответов

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

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

Одной вещью, которую Вы хотите высматривать, является неаккуратное использование попытки/выгоды. Попытка/выгода не должна использоваться для защиты себя от плохого программирования - "Я не знаю то, что произойдет, если я сделаю это так, я собираюсь обернуть его в попытку/выгоду и надежду на лучший" вид программирования. Обычно Вы захотите ограничить виды исключений, которые Вы ловите тем, которые не связаны с самим кодом (сервер вниз, плохие учетные данные, и т.д.) так, чтобы можно было найти и зафиксировать ошибки, которые являются связанным кодом (нулевые указатели, и т.д.).

58
ответ дан tvanfosson 7 November 2019 в 15:23
поделиться

Попытка/Выгода полностью разделяет логику обработки ошибок от объектной бизнес-логики.

7
ответ дан Trap 7 November 2019 в 15:23
поделиться

Преимущество попытки/выгоды и исключений в целом, больше для людей разработка библиотеки как PDO. Они позволяют разработчику системы обрабатывать неопределенные ситуации или неожиданные результаты быстрым и простым способом. Возьмите соединение с базой данных. Что должно система делать, если база данных не может быть достигнута. Это должно остановить выполнение? Попробовать еще раз? Бросить предупреждение и продолжить? Разработчик системы не может знать то, что Вам будет нужен он, чтобы сделать, они они выдают исключение, которое Вы позже поймаете и обработаете.

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

  1. быть названным таким способом, которым более очевидно, что пошло не так, как надо (Если я помню право, PDO только имеет один Тип исключительной ситуации, но другие системы содержат несколько типов исключительной ситуации для различных видов ошибок)

  2. May содержит методы и свойства, которые могут помочь Вам выяснить , почему исключение было выдано

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

8
ответ дан Alan Storm 7 November 2019 в 15:23
поделиться

@Perchik:

Моя общая философия обработки ошибок:

Вы должны использование, если / еще для обработки всех случаев Вы ожидаете. Вы должны не попытка использования {} выгода {} для обработки все (в большинстве случаев), потому что полезное Исключение могло быть повышено, и можно узнать о присутствии ошибки от него. Вы должны попытка использования {} выгода {} в ситуациях, где Вы подозреваете, что что-то может/, идут не так, как надо, и Вы не хотите, чтобы она снизила целую систему, как сетевые проблемы тайм-аута/доступа к файловой системе, файлы не существует, и т.д.

Раздражающие исключения

7
ответ дан Jared Updike 7 November 2019 в 15:23
поделиться

У всех других были хорошие ответы - но я полагал, что брошу свое собственное в:

  1. Попытка/Выгода является фактическим механизмом обработки исключений - поэтому при изменении исключений она будет автоматически работать над всеми операторами попытки/выгоды.
  2. Попытка/Выгода дает возможность выполнить код даже в случае основного исключения, которое могло бы уничтожить, если/еще и кроме того, оператор попытки может откатываться (если Вы - здравый смысл).
3
ответ дан Adam Nelson 7 November 2019 в 15:23
поделиться

Достигните единой точки зрения с @Jared Updike

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

, например, Это "еще" должно быть пункт, который показывает пользователю ATM, сообщение "Недостаточное банковское сальдо", когда его баланс является низким. И это сообщение не МОЖЕТ находиться в блоке "выгоды" ни по какой причине!!

1
ответ дан Vijay Dev 7 November 2019 в 15:23
поделиться

Так как PDO использует объекты, они повышают Исключения, если ошибка происходит. Старые mysql/mysqli были простыми функциями и не выдавали исключения, они просто возвратили коды ошибки. Попытка/выгода используется, когда Исключение может быть выдано от кода, и Вы ловите его в пункте выгоды, который является объектно-ориентированным способом обработать ошибки. Вы не можете поймать Исключения с тем, если/еще блоки - они ничего не совместно используют с попыткой/выгодой.

2
ответ дан Björn 7 November 2019 в 15:23
поделиться

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

7
ответ дан Not Sure 7 November 2019 в 15:23
поделиться

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

Править: Кроме того, блоки выгоды не будут мешать Вашему коду остановиться, когда ошибка будет поражена.

14
ответ дан Perchik 24 November 2019 в 18:53
поделиться

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

5
ответ дан Shaun Humphries 24 November 2019 в 18:53
поделиться

Попытайтесь функции Выгоды полезны каждый раз, когда существует коммуникация между функциями. В Пытаются Выгода, если бы там существует исключение в блоке ПОПЫТКИ, управление передается непосредственно блоку ВЫГОДЫ, который сохранил бы наше условие исключений. Это однако не возможно в случае того, ЕСЛИ ЕЩЕ, где в том, ЕСЛИ условие, если там существует исключение, управление, ЕЩЕ не может перейти в блок как бы ни в любом случае.

int division(int a,int b){
    if(b==0)
       throw 101;
    return a/b;
}

int main()
{
    int a=10,b=0,c;
    try{
        c=division(a,b);
        cout<<c<<endl;
    }
    catch(int a){
        cout<<"Division not possible by 0"<<endl;
   }
}

Рассматривают следующий Код: функция броска и выгоды используется для коммуникации между подразделением функций и основной функцией. Обратите внимание, что оператор для печати c не выполняется, когда b 0, поскольку управление непосредственно передает блоку выгоды после значения брошенная OS. Это однако не было бы возможно, ЕЩЕ имел ЕСЛИ здесь.

-2
ответ дан 24 November 2019 в 18:53
поделиться
Другие вопросы по тегам:

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