我在我的wxpython应用程序中创建了一个弹出密码框的函数。 dialogs.py中的代码如下所示:
def password_dialog(self, password):
# Only ask for password if it actually exist
if password == 'False':
return True
question = 'Put in password:'
dialog = wx.PasswordEntryDialog(self, question, 'Password...')
if dialog.ShowModal() == wx.ID_OK:
if dialog.GetValue() == password:
dialog.Destroy()
return True
else:
dialog.Destroy()
__wrong_pass()
raise WrongPassword
else:
dialog.Destroy()
raise CancelDialog
例外情况在同一个文件中:
class WrongPassword(Exception):
pass
class CancelDialog(Exception):
pass
在我的主程序中,我有一些看起来像这样的方法:
def on_sort_songs(self, event):
"""Renumbering the database and sort in artist and title order"""
# Check for password first
try:
dialogs.password_dialog(self, opts.generic['password'])
except dialogs.CancelDialog:
return
except dialogs.WrongPassword:
return
# Sort database and repopulate GUI
self.jbox.sort_songs()
self.populate_songlist()
工作正常。但它似乎不是处理密码对话框的一种非常好的和pythonic方式。或者是吗?
答案 0 :(得分:1)
我不认为你的对话功能应该在这种情况下引发异常。根据验证是否通过,只需返回True或False。那么你需要做的就是:
validated = dialogs.password_dialog(self, opts.generic['password'])
if validated:
print "Yay"
else:
print "Boo"
仅在您要区分的其他随机故障情况下才需要例外,例如“身份验证服务器已关闭”
我认为在这种情况下返回True或False的另一个原因是因为您可以使用可以换出的模块化身份验证方法。例如django如何使用返回布尔值的单个is_authenticated()方法。最终用途只需要担心其是否经过身份验证。不是它特别引发的各种异常,例如关闭对话框。有些情况甚至可能不使用对话框......可能是命令行,也可能是Web界面等。