Могу ли я создавать определяемые пользователем исключения в классе вместо создания для каждой функции, когда это необходимо в python? Пожалуйста, порекомендуйте - PullRequest
0 голосов
/ 31 марта 2020

Когда я создал try-исключение в классе, как показано, получая ошибку: (Причина создания пользовательского исключения в классе заключается в том, что я могу повторно использовать исключение в любой функции, когда это необходимо, и могу выдавать ошибку)

class Error(Exception):
   pass
class ValueTooSmallError(Error):
   pass
class ValueTooLargeError(Error):
   pass

import random
class GuessNum(object):
    try:
        def __init__(self):        
            self.number = random.randint(1,50)

        def startGame(self):        
            while True:
               i_num = int(input("Enter a number: "))
               if i_num < self.number:
                   raise ValueTooSmallError
               elif i_num > self.number:
                   raise ValueTooLargeError
               break
    except ValueTooSmallError:
       print("This value is too small, try again!")
       print()
    except ValueTooLargeError:
       print("This value is too large, try again!")
       print()

Но, когда я создал try-кроме внутри функции, скрипт работал нормально, но хотел знать, почему вышеприведенный скрипт не удался. Пожалуйста, сообщите.

number = 10
while True:
   try:
       i_num = int(input("Enter a number: "))
       if i_num < number:
           raise ValueTooSmallError
       elif i_num > number:
           raise ValueTooLargeError
       break
   except ValueTooSmallError:
       print("This value is too small, try again!")
       print()
   except ValueTooLargeError:
       print("This value is too large, try again!")
       print()
print("Congratulations! You guessed it correctly.")

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Проблема в том, что вы используете попробовать, кроме неправильного. Целью блоков try-catch является обработка ошибок во время выполнения, которые вы, возможно, уже знаете. Однако определение таких вещей, как функции или классы, не генерирует ошибки во время выполнения. Если ваше определение неверно, переводчик даже не начнет свою работу. Когда вы определяете функцию, вы просто указываете ей, что делать, если она вызывается. Если вы определяете функцию, которая может вызвать ошибку, как в следующем примере, код с определением функции будет по-прежнему выполняться:

number_of_oranges = 40
total_students = 0
def give_oranges():
        orange_for_each = number_of_oranges/total_students
    return orange_for_each

give_oranges()

Здесь, когда вы вызываете функцию give_oranges(), она будет работать большую часть раз, за ​​исключением случаев, когда нет учеников, что означает total_students = 0, это вызовет ошибку ZeroDivisionError. Таким образом, мы помещаем оператор, в котором мы вызываем эту функцию, в try-exc. Запомните, это не определение функции, потому что она просто определяет функцию, но больше ничего не делает.

number_of_oranges = 40
total_students = 0

def give_oranges():
        orange_for_each = number_of_oranges/total_students
    return orange_for_each
try:
    give_oranges()
except ZeroDivisionError:
    print("There are no students!")

give_oranges()

На этот раз, если учеников нет, мы увидим, как выполняется блок исключений и "Там не студенты! на экране.

Теперь, когда мы четко знаем, где именно использовать try-catch, давайте намеренно допустим ошибку и поместим само определение функции в try catch, но не в оператор, в котором мы ее вызвали.

number_of_oranges = 40
total_students = 0

try:
  def give_oranges():
    orange_for_each = number_of_oranges/total_students
    return orange_for_each
except ZeroDivisionError:
  print("There are no students!")

give_oranges()

На этот раз также возникает ошибка, но выглядит странно:

Traceback (most recent call last):
  File "main.py", line 11, in <module>
    give_oranges()
  File "main.py", line 6, in give_oranges
    orange_for_each = number_of_oranges/total_students
ZeroDivisionError: division by zero

Кажется, что наш блок исключений не был выполнен, как мы ожидали. Ошибка возникла с того места, где была вызвана функция. Вот объяснение: когда интерпретатор Python читал до последней строки, он уже знал, что делает метод give_oranges (), и знал, что делать, если определение этой функции не сработало. Определение функции было абсолютно правильным, поэтому ошибки не возникало, и в блоке исключений не было ни одной ошибки ZeroDivisionError. Только когда мы позже использовали эту функцию, ошибка возникла снова, но на этот раз не было блока try-кроме, чтобы поймать точное выражение.

В вашем случае вы пытаетесь охватить некоторые определения, а не где вы на самом деле называете эти определения. Ошибка возникает, но не улавливается вами должным образом, она обрабатывается некоторыми встроенными механизмами в Python классах. Извините за то, что вы перешли за рамки примеров и не указали на ошибку в вашем коде напрямую, но теперь вы должны лучше понять, где не использовать try-excepts и где правильно его использовать.

0 голосов
/ 31 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...