【问题标题】:Python - Warning: Unexpected Error: <class 'IndexError'>Python - 警告:意外错误:<class 'IndexError'>
【发布时间】:2018-02-13 12:50:05
【问题描述】:

我正在尝试使用一些代码从名为“.logon”的文件中读取用户名和密码并建立与 redshift 的连接。但我收到错误消息“Python - 警告:意外错误:”。

这是我的代码:

def redshift_connect():  
    try:  
        l_user = getpass.getuser()  
        home = expanduser("~")  
        f = open(home + '/.logon')  
        logline = f.readline()  
        usr = logline.split(',')[0].split('/')[1].strip()  
        pwd = logline.split(',')[1].rstrip()  


        conn=psycopg2.connect(host='host-name',  
        port= 5439, user= usr, password= pwd)  
        return conn  
    except IOError as e:  
        print ('I/O error ({0}): {1}: .tdlogon missing!!'.format(e.errno, e.strerror))
    except:  
        print ('Warning: Unexpected Error:',sys.exc_info()[0])  
    else:
        raise ConnectionError('Cannot establish connectionw with Redshift.')

【问题讨论】:

  • 我认为这里的问题是这是horrible python code:[...] Never use catch-all except
  • Protip:除非输出有用错误信息,否则不要捕获异常。如果您没有捕获异常并让它输出其完整的堆栈跟踪,这将提供更多信息。
  • 问题很可能是其中一个split(..) 不会产生两个 元素,因此[1] 会引发IndexError。
  • 另外:else 中的try 表示如果没有发生异常。因此,如果没有出现任何问题,您会抛出异常以防万一?
  • 是的。异常信息隐藏在一个名为sys.exc_info 的奇怪结构中并且具有难以记住的复杂结构是有原因的:您不应该经常使用它。如果您不知道如何处理它,请不要抓住它。处理可以重新提升(只需在except 子句中执行raise)。

标签: python error-handling amazon-redshift


【解决方案1】:

我猜想表达式logline.split(',') 可以工作并返回一个只有一个条目的数组。表达式logline.split(',')[1] 然后引发一个IndexError,您可以在非特定的except 子句中捕获它。

【讨论】:

    猜你喜欢
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2016-09-09
    • 1970-01-01
    • 2018-04-15
    • 2010-11-27
    相关资源
    最近更新 更多