У меня была эта проблема и она была решена так:
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, но это меня действительно раздражало.
Я использовал бы блок попытки/выгоды, когда обычный тракт через код должен продолжиться без ошибки, если нет действительно некоторые исключительные условия - как снижающийся сервер, Ваши учетные данные, истекшие или неправильные. Я не обязательно использовал бы его для обработки неисключительных ошибок - говорят как текущий пользователь, не находящийся в корректной роли. Таким образом, когда можно обоснованно ожидать и обработать ошибку, которая не является исключительным условием, я думаю, что необходимо сделать проверки.
В случае, который Вы описали - установка и выполнение запроса, блок попытки/выгоды является отличным способом обработать его, поскольку Вы обычно ожидаете, что запрос успешно выполнится. С другой стороны, Вы, вероятно, захотите проверить, что содержание результата - то, что Вы ожидаете с логикой потока управления вместо того, чтобы просто пытаться использовать данные, которые не могут быть допустимыми для Вашей цели.
Одной вещью, которую Вы хотите высматривать, является неаккуратное использование попытки/выгоды. Попытка/выгода не должна использоваться для защиты себя от плохого программирования - "Я не знаю то, что произойдет, если я сделаю это так, я собираюсь обернуть его в попытку/выгоду и надежду на лучший" вид программирования. Обычно Вы захотите ограничить виды исключений, которые Вы ловите тем, которые не связаны с самим кодом (сервер вниз, плохие учетные данные, и т.д.) так, чтобы можно было найти и зафиксировать ошибки, которые являются связанным кодом (нулевые указатели, и т.д.).
Попытка/Выгода полностью разделяет логику обработки ошибок от объектной бизнес-логики.
Преимущество попытки/выгоды и исключений в целом, больше для людей разработка библиотеки как PDO. Они позволяют разработчику системы обрабатывать неопределенные ситуации или неожиданные результаты быстрым и простым способом. Возьмите соединение с базой данных. Что должно система делать, если база данных не может быть достигнута. Это должно остановить выполнение? Попробовать еще раз? Бросить предупреждение и продолжить? Разработчик системы не может знать то, что Вам будет нужен он, чтобы сделать, они они выдают исключение, которое Вы позже поймаете и обработаете.
преимущество для Вас, как потребитель системы вместо того, чтобы возвращать некоторый неопределенный код ошибки или простую булеву ложь, которую это привело к сбою, Вы получаете Объект исключения, который будет
быть названным таким способом, которым более очевидно, что пошло не так, как надо (Если я помню право, PDO только имеет один Тип исключительной ситуации, но другие системы содержат несколько типов исключительной ситуации для различных видов ошибок)
May содержит методы и свойства, которые могут помочь Вам выяснить , почему исключение было выдано
, Это - теория так или иначе. Существует много умных людей, которые утверждают, что Исключениями является способ пойти. Существует также много умных людей, которые думают, что Исключениями является дьявол и опора для ленивых разработчиков системы. Нет ничего напоминающего согласие по этой проблеме.
@Perchik:
Моя общая философия обработки ошибок:
Вы должны использование, если / еще для обработки всех случаев Вы ожидаете. Вы должны не попытка использования {} выгода {} для обработки все (в большинстве случаев), потому что полезное Исключение могло быть повышено, и можно узнать о присутствии ошибки от него. Вы должны попытка использования {} выгода {} в ситуациях, где Вы подозреваете, что что-то может/, идут не так, как надо, и Вы не хотите, чтобы она снизила целую систему, как сетевые проблемы тайм-аута/доступа к файловой системе, файлы не существует, и т.д.
У всех других были хорошие ответы - но я полагал, что брошу свое собственное в:
Достигните единой точки зрения с @Jared Updike
, Обычно обработка исключений сделана с пользователем, знающим мало или ничем об этом. С другой стороны, пользователь системы знает о том, что происходит в если еще блок.
, например, Это "еще" должно быть пункт, который показывает пользователю ATM, сообщение "Недостаточное банковское сальдо", когда его баланс является низким. И это сообщение не МОЖЕТ находиться в блоке "выгоды" ни по какой причине!!
Так как PDO использует объекты, они повышают Исключения, если ошибка происходит. Старые mysql/mysqli были простыми функциями и не выдавали исключения, они просто возвратили коды ошибки. Попытка/выгода используется, когда Исключение может быть выдано от кода, и Вы ловите его в пункте выгоды, который является объектно-ориентированным способом обработать ошибки. Вы не можете поймать Исключения с тем, если/еще блоки - они ничего не совместно используют с попыткой/выгодой.
Бросок и ловля исключения являются дорогой операцией по сравнению с большей частью любой другой примитивной операции. Если это будет частью кода, который должен работать хорошо (например, в жестком цикле), то Вы захотите посмотреть на свой вариант использования - если Вы будете ожидать, что исключения будут брошены относительно часто, то Вы будете более обеспечены с, если/еще perforance-мудрый (если базовый код просто не обертывает исключение для Вас, в этом случае нет никакого усиления вообще). Если исключения только выдаются при редких обстоятельствах, то Вы более обеспечены с попыткой/выгодой избежать издержек ветвления в жестком цикле.
В целом блоки try-catch являются большими, потому что они повредятся (переместитесь в оператор выгоды) каждый раз, когда исключение происходит. Если еще блоки полагаются на Вас предсказывающий, когда ошибка произойдет.
Править: Кроме того, блоки выгоды не будут мешать Вашему коду остановиться, когда ошибка будет поражена.
Это - точно преимущество, с помощью одной попытки/выгоды вместо нескольких если операторы. Вы также сможете зафиксировать любые непредвиденные ошибки.
Попытайтесь функции Выгоды полезны каждый раз, когда существует коммуникация между функциями. В Пытаются Выгода, если бы там существует исключение в блоке ПОПЫТКИ, управление передается непосредственно блоку ВЫГОДЫ, который сохранил бы наше условие исключений. Это однако не возможно в случае того, ЕСЛИ ЕЩЕ, где в том, ЕСЛИ условие, если там существует исключение, управление, ЕЩЕ не может перейти в блок как бы ни в любом случае.
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. Это однако не было бы возможно, ЕЩЕ имел ЕСЛИ здесь.