Python尝试/除了不工作

时间:2013-01-22 13:54:25

标签: python try-catch python-2.4

尝试让try/except语句正常工作但遇到问题。此代码将采用txt文件并将位置行0中的文件复制到第1行的位置。但是,如果我将其中一个路径更改为无效路径,则会生成错误ftplib.error_perm但是except命令是没有拿起,一切都停止了。我究竟做错了什么? Python 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)

7 个答案:

答案 0 :(得分:4)

except子句只会捕获raise块内try d的异常。尝试将docopy函数调用放在try块内:

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

答案 1 :(得分:3)

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

请注意,docopy会返回None。因此,当您尝试从iter中生成None时,您会引发异常 - 但它不会是ftplib.error_perm例外,它将是{{1} }}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

finally

答案 4 :(得分:0)

此示例在Python3.3 +中是通用的,当装饰生成器函数时,装饰的生成器成功返回,因此除未进入装饰器外,魔术发生了yield from f从而将可包装的内容包装在装饰器中:

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

答案 5 :(得分:0)

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

try:
    # some code
except Exception: # Or only except:
   print "Error" # Python 3: print("Error")

答案 6 :(得分:-1)

好吧,我在Visual Studio Code中遇到了同样的问题:

import numpy as np

def func():

    try:

        a = np.log(-9)
        print(a)

    except:
        print ('exception !') # this will never triggered

func()