11

试图让try/except语句正常工作但遇到问题。此代码将获取一个 txt 文件并将位于第 0 行位置的文件复制到第 1 行的位置。它可以工作但是如果我将其中一个路径更改为无效的路径,它会生成一个错误ftplib.error_perm但是除了命令没有拾取并且一切停止。我究竟做错了什么?蟒蛇2.4

import csv
import operator
import sys
import os
import shutil
import logging
import ftplib
import tldftp

def docopy(filename):
        ftp = tldftp.dev()
        inf = csv.reader(open(filename,'r'))
        sortedlist = sorted(inf, key=operator.itemgetter(2), reverse=True)
        for row in sortedlist:
                src = row[0]
                dst = row[1]
                tldftp.textXfer(ftp, "RETR " + src, dst)


def hmm(haha):
    result = docopy(haha);
    try:
        it = iter(result)
    except ftplib.error_perm:
        print "Error Getting File" 


if __name__ == "__main__":
        c = sys.argv[1]
        if (c == ''):
                raise Exception, "missing first parameter - row"
        hmm(c)
4

6 回答 6

9

except子句将仅捕获raised 在其相应try块内的异常。尝试将docopy函数调用也放在try块内:

def hmm(haha):
    try:
        result = docopy(haha)
        it = iter(result)
    except ftplib.error_perm:
        print "Error Getting File" 
于 2013-01-22T13:57:08.510 回答
4

代码中引发错误的点必须在try块内。在这种情况下,错误很可能在docopy函数内部引发,但并未包含在try块中。

请注意,docopy返回None. 因此,当您尝试iter退出时,您将引发异常None——但这不会是ftplib.error_perm异常,而是TypeError

于 2013-01-22T13:56:25.793 回答
1

如果您不确定会发生什么异常,请使用下面的代码,因为如果指定例如:除了 StandardError: 并且不是该错误,则不会处理异常。

try:
    # some code
except Exception: # Or only except:
   print "Error" # Python 3: print("Error")
于 2019-08-23T20:38:17.883 回答
0

我知道 OP 是古老的,但对于那些迫切需要这个问题的答案的人来说。我遇到了类似的问题,具体取决于您的 IDE,如果您在具有特定异常等的任何行上有一个断点,这可能会发生冲突并停止 try/except 执行。

于 2017-10-19T16:21:24.990 回答
0

我注意到全局异常可能不起作用,例如,Ctrl+Cepub.py模块执行urllib3连接触发KeyboardInterrupt但无法在主线程中捕获时,解决方法是将我的清理代码放入其中finally,例如:

try:
    main()
except Exception as e:
    clean_up_stuff()  #this one never called if keyboard interrupt in module urllib3 thread
finally: #but this work
    clean_up_stuff() 
于 2018-08-05T12:14:19.023 回答
0

这个例子对于 Python3.3+ 是通用的,当装饰一个生成器函数时,一个被装饰的生成器成功返回,因此不会进入装饰器 except,神奇的发生yield from f是在装饰器中包装了 yieldable:

from types import GeneratorType    

def generic_exception_catcher(some_kwarg: int = 3):
    def catch_errors(func):
        def func_wrapper(*args, **kwargs):
            try:
                f = func(*args, **kwargs)
                if type(f) == GeneratorType:
                    yield from f
                else:
                    return f
            except Exception as e:
                raise e
        return func_wrapper
    return catch_errors

用法:

@generic_exception_catcher(some_kwarg=4)
def test_gen():
    for x in range(0, 10):
        raise Exception('uhoh')
        yield x

for y in test_gen():
    print('should catch in the decorator')
于 2019-03-13T22:09:13.953 回答