LINUX.ORG.RU

python + exceptions


0

0

А вот как узнать возбуждает ли какая-нибудь функция исключение? В яве это было не сложнои просто если что-то исключение могло возбуждать (throws в спецификации) то ты просто обязан был окружить это дело try/catch. А как здесь? Например:

#!/usr/bin/env python

import re
re.compile("ble(")

И пока я не получу исключения sre_constants.error я вообще не узнаю о том что оно может быть возбуждено, не из help(re.compile), ниоткуда.. Ни даже отсюда: http://docs.python.org/lib/matching-searching.html

Как узнается о возбуждаемых исключениях функция в питоне?

Ответ на: комментарий от anonymous

> Офигеть. как жаба людей портит! Из мануала узнаётся, друк.
Где?

compile(pattern, flags=0)
Compile a regular expression pattern, returning a pattern object.

(c) pydoc re

Там же:

exceptions.Exception
sre_constants.error

и все... Что его возбуждает гадай или как кто-то тут предложил окружай все try, что опять же ничего не даст, try this:

try:
print "wtf"
except:
pass

Никто не ругается. Так не узнаешь возбуждает ли кто-то исключение или нет.

Даже в C++ можно было в спецификации функции задать какие исключения она возбуждает неужели здесь никак кроме как просмотром исходников?

dissident ★★
() автор топика

>Как узнается о возбуждаемых исключениях функция в питоне

А зачем о них узнавать? Если ты не знаешь, какое может быть исключение, ты не можешь знать, что с ним делать, следовательно тебе не нужно о них узнавать. Меньше знаешь - меньше пишешь:).

DonkeyHot ★★★★★
()
Ответ на: комментарий от dissident

> А могло бы упасть красиво или вовсе

Во-во, красиво. Насмотрелся я уже, как лор красиво падает. По-твоему, если исключение не задекларировано, то его никогда не возникнет? Гы-гы.

anonymous
()
Ответ на: комментарий от anonymous

Ну вот первый из бочки пример, с тем же re, получаем от юзера ввод и кормим его в re.compile, забываем что оно возбуждает exception и программа валится а могла бы просто проигнорировать.

Пример конечно высосан из пальца но.. Имхо было бы лучше если бы была спецификация в стиле

def wtf(): throws ...

Или хотя бы если бы в доках писали что конкретно возбуждает исключения а не как тут:

exception error
Exception raised when a string passed to one of the functions here is not a valid regular expression (for example, it might contain unmatched parentheses) or when some other error occurs during compilation or matching. It is never an error if a string contains no match for a pattern.

(c) http://docs.python.org/lib/node115.html

Слишком общо. Непонятно кто конкретно возбуждает и нужно догадываться.

dissident ★★
() автор топика
Ответ на: комментарий от dissident

> Имхо было бы лучше если бы была спецификация в стиле def wtf(): throws ...

Такие декларации ни разу не вписываются в идеологию Питона. Тем более, что Питон из них никакой пользы извлечь не сможет. Вся эта информация обычно пишется в docstring'е, а оттуда и в документацию автоматически попадёт.

> Или хотя бы если бы в доках писали что конкретно возбуждает исключения а не как тут

В процитированном Вами куске коротко и ясно сказано: если передать неправильный регэксп, возбуждается исключение re.error. Оно же может возбуждается при возникновении разных непонятных ошибок. В других случаях не возбуждается. Что непонятно-то? =)

ero-sennin ★★
()
Ответ на: комментарий от dissident

> Проще в код посмотреть.

Проще не использовать исключения вообще. Писать в процедурном стиле на С, и не парить себе мозг питоном.

logIN
()
Ответ на: комментарий от logIN

Дадададададад, жертва детского БЕЙСИКа!

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

anonymous
()
Ответ на: комментарий от dissident

>потом в коде куча мест где все некрасиво падает

А ты не перехватывай _всё_ - и будет падать (по этой причине) всегда в одном месте:-) Делов то.

>а не как тут: exception error

Ты же должен знать, что такое стандартное API, и что такое "расширения/реализации"? [Вероятно] Разработчики решили, что у разных реализаций регекспов один общий тип ошибок - re.error - всё остальное зависит от реализации. Его и документировали, а остальными пользоваться некошерно. А кому нужно - UTSL.

DonkeyHot ★★★★★
()
Ответ на: комментарий от dissident

> И потом в коде куча мест где все некрасиво падает... А могло бы упасть красиво или вовсе

Те места, где не должно падать, надо заключать в try/except всегда. Причем, универсальный, отлавливающий все исключения.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от dissident

> Непонятно кто конкретно возбуждает и нужно догадываться.

Возбуждают все.

> def wtf(): throws ... 

Как мило! Посоветуйте, что кидает нижеследующая функция?

def my_map( func, lst ) :
  return [ func(x) for x in lst ]

watashiwa_daredeska ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.