2013-09-27 3 views
0

Это то, что я получил:Исключения коды класса не работают

class E2Exception(Exception): 
    pass 


class E2OddException(E2Exception): 
    pass 


def raiser(x): 
    if x == "So sue me!": 
     raise E2Exception 
    elif x != "So sue me!" and x not int: 
     raise ValueError 
    elif int(x) % 2 != 0: 
     raise E2OddException() 
    else: 
     return None 

Как мы говорим, если й не раскладываются в междунар, сделать это?

Кроме того, я получаю эту ошибку:

builtins.TypeError: исключения должны извлечь из BaseException

Что это значит?

Инструкции ниже


E2Exception: класс исключение, которое является подклассом Exception.

E2OddException: класс исключения, являющийся подклассом E2Exception.

raiser, функция, которая принимает один параметр x со следующим поведением:

  • Если x == 'So sue me!', то raiser(x) поднимает E2Exception за исключением сообщения "New Yorker".

  • Если x != 'So sue me!', но x до сих пор не конвертируемые к Int (путем вызова int(x)), то raiser(x) поднимает ValueError, без какого-либо требования на сообщении об исключении

  • Если x превращается в нечетные int , raiser(x) вызывает E2OddException, без каких-либо требований к сообщению об исключении.

  • В противном случае raiser(x) ничего не делает (без возврата, без печати, ничего вообще).

+0

Вы должны 'raise' исключения, а не' return' их. –

ответ

1

How do we say if x is not convertible to an int, do this?

try: 
    int(x) 
except ValueError: 
    ... # Not convertable 
else: 
    ... # Convertable 

В этом случае вы можете захотеть установить переменную:

try: 
    int(x) 
except ValueError: 
    intable = True 
else: 
    intable = False 

, которые вы можете использовать в остальной части кода (elif x != "So sue me!" and not intable: вместо elif x != "So sue me!" and x not int:).


Обратите внимание, что ваш

else: 
    return None 

является не оп и может быть полностью удален.

+0

Спасибо за помощь! Вопрос, где бы я вставлял код try-except-else? Еще раз спасибо :) – muros

+0

Кроме того, если x не является intable, автоматически ли он вызывает ValueError? Если бы x == ValueError: сделать это ... работать? – muros

+0

Вы должны положить это в свою функцию 'raiser', прежде чем вам понадобится использовать переменную' intable'. // 'int' вызывает' ValueError', если он не может преобразовать его значение, да. Я не уверен, что вы ожидаете, что 'x' будет когда-либо равным *' ValueError'. – Veedrac

1

int() вызывает исключение при передаче недопустимого ввода, поэтому вы можете просто позволить этому случиться и избавиться от вашего return ValueError (что действительно должно быть raise).

Кроме того, Python автоматически возвращает None, если вы явно не вернуть ничего, так что вы можете упростить код просто:

def raiser(x): 
    if x == "So sue me!": 
     raise E2Exception("New Yorker") 
    elif int(x) % 2 != 0: 
     raise E2OddException() 
+0

Если x == 'Так что мне нужно! !, то рейзер (x) вызывает E2Exception с сообщением об исключении "New Yorker". Итак, разве это не должно быть причиной E2Exception? Как добавить сообщение об исключении в E2Exception? Большое спасибо – muros

+0

Ах, неважно, понял! Еще раз спасибо – muros

+0

@muros: Вы можете добавить сообщение в любое исключение, просто передав его в качестве аргумента: 'raise E2Exception (" New Yorker ")' – Blender

Смежные вопросы