【发布时间】: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