Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重复尝试和例外条款_Python_Try Catch_Except - Fatal编程技术网

Python 重复尝试和例外条款

Python 重复尝试和例外条款,python,try-catch,except,Python,Try Catch,Except,我已经创建了一系列函数,所有函数中都需要非常相似的except子句,但我讨厌在每个函数中有这么多行try和except子句以及相同的代码。例如: import sys import random def foo(): num=random.random() try: if num>0.5: print 'OK' elif num>0.25: raise NameError('Too Small') else: rais

我已经创建了一系列函数,所有函数中都需要非常相似的except子句,但我讨厌在每个函数中有这么多行try和except子句以及相同的代码。例如:

import sys
import random

def foo():
    num=random.random()
    try:
        if num>0.5: print 'OK'
        elif num>0.25: raise NameError('Too Small')
        else: raise KeyboardInterrupt
    except NameError:
        print "%s had a NameError" % sys._getframe().f_code.co_name
    except:
        print "%s had a different Error" % sys._getframe().f_code.co_name

def bar():
    num=random.random()
    try:
        if num>0.8: print 'OK'
        elif num>0.6: raise NameError('Too Small')
        else: raise KeyboardInterrupt
    except NameError:
        print "%s had a NameError" % sys._getframe().f_code.co_name
    except:
        print "%s had a different Error" % sys._getframe().f_code.co_name
函数的“try”后的代码不同,但“except”后的代码相同。我想合并那些语句,这样它们就不会使我的代码看起来太狭窄。有什么好办法吗?

就是你想要的

你说过除块总是一样的。做一个定制的装饰,做你想要的。您必须将此应用于每个函数/方法,但它确实可以避免重复

def handleError(function):
    def handleProblems():
        try:
            function()
        except Exception:
            print "Oh noes"
    return handleProblems


@handleError
def example():
   raise Exception("Boom!")
调用应用了decorator的方法时:

>>> >>> example() Oh noes >>> >>> >>>示例() 哦,不 >>>
您将需要更改异常类型以及所做的操作,但您将获得我将要使用的jist。

您的
try
块中的内容是有趣的内容,因此应该在函数中。然后只需选择您想要的函数,并调用它,由您的异常包装。您甚至可以将异常代码作为函数编写,并将所选函数作为参数传递给它。e、 g

def foo():
    num=random.random()
    if num>0.5: print 'OK'
    elif num>0.25: raise NameError('Too Small')
    else: raise KeyboardInterrupt

def bar():
    num=random.random()
    if num>0.8: print 'OK'
    elif num>0.6: raise NameError('Too Small')
    else: raise KeyboardInterrupt

def try_numerics(f):
    try:
        f()
    except NameError:
        print "%s had a NameError" % sys._getframe().f_code.co_name
    except:
        print "%s had a different Error" % sys._getframe().f_code.co_name

# In your main code...
if (need_to_run_foo):
    try_numerics(foo)
elif (need_to_run_bar):
    try_numerics(bar)

如果这些是您的实际函数,那么很容易对它们进行概括

您可以创建一个通用函数

def general(bottom_num, top_num):
  num=random.random()
  try:
    if num>top_num: print 'OK'
    elif num>bottom_num: raise NameError('Too Small')
    else: raise KeyboardInterrupt
  except NameError:
    print "%s had a NameError" % sys._getframe().f_code.co_name
  except:
    print "%s had a different Error" % sys._getframe().f_code.co_name

这将防止代码重复并解决try:except:issue

上面的答案不适用于带有参数的函数-对于后一种情况,我认为您需要类似以下内容:

def handleError(f):
    def handleProblems(*args, **kwargs):
        try:
            return f(*args, **kwargs)
        except Exception:
            print "Oh noes"
    return handleProblems
我们可以这样测试:

@handleError
def addTwo(x, y): 
    print(x + y) 

>>> addTwo(5,5)
10
>>> addTwo(5, 's')
Oh noes 

我最近遇到了同样的情况,在我的例子中,我有一些自定义异常,我需要根据这些异常记录或进一步引发异常。我创建了一个decorator方法来按类型处理异常

try:
   obj.some_method()
except Exception as e:
    catch_and_log_exception(e)


def catch_and_log_exception(e):
    if isinstance(e, MyConnectionError):
        print "Connection error : %s." % e.message
        sys.exit(1)
    elif isinstance(e, MyConnectionTimeout):
        print "Connection to server has been timed out. %s" % e.message
        sys.exit(1)
    elif isinstance(e, MyException):
        message = e.explanation if e.explanation else e.message
        log_error_message(str(message))
        print "Failed, please check the logs."
        sys.exit(1)
    else:
        raise e

希望这有帮助

捕捉任何异常通常都是一个非常糟糕的主意。它掩盖了真正的问题,使调试更加困难。捕捉任何你知道的异常——如果你不知道它们,你真的想捕捉它们吗?这是一个很好的观点。如果函数失败,我确实需要脚本继续。最后一个“except”包括打印sys.exc_info()[:2],其中包括异常的名称。有更好的方法吗?这不是一个好例子,因为decorator不适用于带参数的函数。