Визначення виключення без параметрів:
class MyException(Exception):
pass
Чи є різниця між:
raise MyException
і
raise MyException()
Я не міг знайти жодного; це просто перевантажений синтаксис?
Визначення виключення без параметрів:
class MyException(Exception):
pass
Чи є різниця між:
raise MyException
і
raise MyException()
Я не міг знайти жодного; це просто перевантажений синтаксис?
Відповіді:
Коротка відповідь , що обидва raise MyExceptionі raise MyException()зробити те ж саме. Ця перша форма автоматично створює ваш виняток.
Відповідний розділ з документації каже, " підвищення оцінює перший вираз в якості об'єкта виключення. Це повинно бути підкласом або екземпляр BaseException. Якщо це клас, екземпляр виключення буде отримано , коли це необхідно інстанцірованія класу з ніяких аргументів ».
Тим не менш, незважаючи на те, що семантика однакова, перша форма мікроскопічно швидша, а друга форма більш гнучка (оскільки ви можете передавати їй аргументи, якщо це потрібно).
Звичайний стиль, який більшість людей використовують в Python (тобто в стандартній бібліотеці, в популярних додатках і в багатьох книгах) - це використовувати, raise MyExceptionколи аргументів немає. Люди виправдовують виняток безпосередньо тоді, коли потрібні певні аргументи. Наприклад: raise KeyError(badkey).
Перегляньте документи для raiseтвердження . Це створює екземпляр MyException.
raise трохи змінився в Python 3. Частина, що стосується цього питання, однакова, хоча ( raise ExceptionTypeвсе-таки створюється екземпляр типу, викликаючи його конструктор без аргументів).
Так, є різниця між ValueErrorіValueError()
ValueErrorє класом, тоді як ValueError()створює екземпляр класу. Це причина type(ValueError) is typeіtype(ValueError()) is ValueError
Єдина мета raise- збільшити виняток,
коли ми використовуємо
ValueError, буде викликаний клас, який, у свою чергу, запускає конструкторValueError()коли ми використовуємо
ValueError(), методValueError()прямо називається.
Примітка: raise ValueError # shorthand for 'raise ValueError()'