0

当我在类中创建 try-except 时,如图所示出现错误:(在类中创建基于用户的异常的原因是,我可以在需要时在任何函数中重新使用异常,并且可以引发错误)

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-except 时工作正常,但想知道为什么上面的脚本失败了。请指教。

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.")
4

2 回答 2

0

在您的课程中,您的 try-except 块正在捕获您的方法定义的潜在错误。如果你想在执行 GuessNum.startGame() 时捕获一些东西,你必须在函数中放置 try-except 块。

于 2020-03-31T15:04:25.003 回答
0

问题是您使用 try-except 错误。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-except中。不是函数定义,请注意,因为它只是定义函数但不做任何其他事情。

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()

这一次如果没有学生,我们将看到 except 块被执行并且“没有学生!” 屏幕上。

现在我们清楚了在哪里使用 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

似乎我们的 except 块没有像我们预期的那样执行。错误是从调用函数的位置引发的。解释如下:当 Python 解释器读到最后一行时,它已经知道 give_oranges() 方法做了什么,如果这个函数的定义不起作用,它知道该怎么做。函数定义绝对正确,因此没有引发错误,并且 except 块没有任何 ZeroDivisionError 要捕获。只是后来我们使用该函数时,错误再次发生,但这一次没有try-except块来捕获确切的语句。

在您的情况下,您试图涵盖一些定义,而不是您实际调用这些定义的位置。该错误已引发但您没有正确捕获,它正在由 Python 类中的一些内置机制处理。很抱歉在示例中过度使用并且没有直接指出代码中的错误,但是现在您应该更好地了解在哪里不使用 try-excepts 以及在哪里正确使用它。

于 2020-03-31T15:27:44.230 回答