Python如何对非正数进行例外

Python如何对非正数进行例外,python,exception,numbers,try-catch,except,Python,Exception,Numbers,Try Catch,Except,如何在这里引发异常以捕获非正输入?现在,如果我输入一个负数,就不会打印任何内容 """ Generate fibonacci sequence to the nth digit """ def fib(n): try: if n <= 0: raise Exception prev = 0 curr = 1 for terms in range(0, int(n)): n

如何在这里引发异常以捕获非正输入?现在,如果我输入一个负数,就不会打印任何内容

"""
Generate fibonacci sequence to the nth digit
"""
def fib(n):
    try:
        if n <= 0:
            raise Exception
        prev = 0
        curr = 1
        for terms in range(0, int(n)):
            nxt = prev + curr
            print str(curr),
            prev = curr
            curr = nxt
    except ValueError or Exception:
        new = raw_input("Invalid input. Please enter a positive integer: ")
        fib(new)

n = raw_input("Enter number of terms: ")
fib(n)
“”“
生成第n位的斐波那契序列
"""
def纤维(n):
尝试:

如果n
除了值错误或异常

正确的语法是
except(ValueError,Exception)
,但请注意,由于所有异常都继承自
Exception
,因此这可能会出现错误

你最好不要提出并试图抓住一个普遍的例外。 相反,请提高已捕获的
ValueError

def fib(n):
    try:
        if n <= 0:
            raise ValueError
    .
    .
    .
    except ValueError:
        .
        .
        .
def fib(n):
尝试:

如果n要捕获多个异常类型,请将它们放入元组中
ValueError或Exception
是一个计算结果为ValueError的布尔表达式

此外,您永远不应该引发异常,也永远不应该捕获它。定义自己的自定义异常类

class NonNegativeNumber(Error):
    pass


...
except (ValueError, NonNegativeNumber):

然而,请注意,ValueError似乎是这里提出的一个完全有效的例外;您可能根本不需要更具体的类。

我认为这里的核心问题是您的
fib
函数有两个完全独立的职责:

  • 处理用户输入和验证;及
  • 计算斐波那契数
  • 从名字上看,我认为它应该只做#2

    相反,将您的程序组织为:

    def positive_integer():
        """Loops until the user enters a positive integer."""
        ...
    
    def fib(n):
        """Prints first n Fibonacci numbers."""
        if n < 0:
            raise ValueError
        prev = 0
        curr = 1
        for terms in range(n):  # note simplification here
            nxt = prev + curr
            print str(curr),
            prev = curr
            curr = nxt
    
    fib(positive_integer())
    
    只有一个:

    prev, curr = curr, curr + prev
    

    还要注意的是,一般来说,您应该使
    try
    块尽可能短,使
    except
    子句尽可能具体。这使得它们在阅读代码时更加有用(“我认为这一点可能会出错,在这种情况下我们可以这样做”),这意味着合法的问题不会被悄悄地忽略。特别是,您几乎不应该直接处理
    异常
    (无论是在
    raise
    还是
    except
    ),它的范围太广,无法有效处理。

    正如Jon所说,将输入收集与核心Fibonacci计算分离是一种更好的设计策略。此外,除非您确实需要递归(例如,在处理递归数据结构(如目录树)时),否则使用简单循环通常比使用递归调用(在其内部调用函数)要好

    这是您的代码的修改版本。我做了一些其他的小改动。在Python中,我们不需要像
    nxt
    这样的临时变量来进行核心斐波那契计算。相反,我们使用元组赋值,这样我们可以更新
    curr
    ,并一步将旧的
    curr
    保存到
    prev

    def input_positive_integer(prompt=''):
        """ Get a positive integer from the user """
        while True:
            try:
                n = int(raw_input(prompt))
                if n <= 0:
                    raise ValueError
                break
            except ValueError:
                print "Invalid input.",
                prompt = "Please enter a positive integer: "
        return n
    
    def fib(n):
        """ Print n terms of the Fibonacci sequence """
        prev, curr = 0, 1
        for terms in range(n):
            print curr,
            prev, curr = curr, prev + curr
    
    n = input_positive_integer("Enter number of terms: ")
    fib(n)
    

    您应该将负数测试移到
    try
    之外-您希望它导致错误!还要注意的是,
    try
    块应该尽可能短,并且
    除外
    测试尽可能具体,否则会隐藏真正的问题。
    ValueError或Exception
    是一个布尔表达式,其计算结果为
    ValueError
    (我相信您很清楚)。快速问题:当您说“int”(原始输入(提示))'是否将输入转换为整数?或者您正在验证输入的类型
    raw\u输入(提示符)
    始终返回字符串
    int(some_string)
    尝试将
    some_string
    转换为整数,但如果
    some_string
    不是表示整数的有效字符串
    int
    将引发
    ValueError
    。因此在表达式
    int(原始输入(提示))
    中,
    int
    为我们处理转换和验证。一旦我们创建了整数
    n
    ,我们就可以继续验证
    n
    是否为非负整数。
    def input_positive_integer(prompt=''):
        """ Get a positive integer from the user """
        while True:
            try:
                n = int(raw_input(prompt))
                if n <= 0:
                    raise ValueError
                break
            except ValueError:
                print "Invalid input.",
                prompt = "Please enter a positive integer: "
        return n
    
    def fib(n):
        """ Print n terms of the Fibonacci sequence """
        prev, curr = 0, 1
        for terms in range(n):
            print curr,
            prev, curr = curr, prev + curr
    
    n = input_positive_integer("Enter number of terms: ")
    fib(n)
    
    Enter number of terms: -4
    Invalid input. Please enter a positive integer: q
    Invalid input. Please enter a positive integer: 2.5
    Invalid input. Please enter a positive integer: 5
    1 1 2 3 5