_create_system_cobbler
関数をスタンドアロンスクリプトで単独で実行すると、エラーをキャプチャできます。この場合、エラーをシミュレートしています。使用しているDNS名が既に存在していると伝えます。しかし、それを関数に入れて、私のmain
関数からの呼び出しを行うと、常にTrue
が返されます。 IPython:try/exceptブロックが常にTrueを返します
エラー:
Error! <class 'cobbler.cexceptions.CX'>:'dns-name duplicated: inadmin001.domain.local'
_create_system_cobbler機能リターンコードを使用して
def _create_system_cobbler():
try:
cobbler_server = xmlrpclib.Server("https://127.0.0.1/cobbler_api")
except socket.error:
print "Can't Connect to Cobbler"
quit()
serverinfo = {
'hostname' : 'inadmin001',
'macaddress': '00:2e:4e:78:ba:86',
'ipaddress': '172.21.10.33',
'dnsname': 'inadmin001.domain.local'
}
try:
token = cobbler_server.login("cobbler","cobbler")
system_id = cobbler_server.new_system(token)
...
<more code>
...
except xmlrpclib.Fault as err:
errormsg = "Error " + str(err.faultString)
return False, errormsg
return True, serverinfo
主な機能
def main(session)
handler, serverinfo = _create_system_cobbler()
if handler:
print "Let's create a VM"
print serverinfo
# Let's continue with the rest of the code
else:
print serverinfo
quit()
あなたはpythonでリターンフラグを使用しないでください。代わりにtry ... exceptを使用してください。 – MaxNoe
@MaxNoe try..exceptが使用されました。私は問題は、 'return'の代わりに' raise'が必要だと思います。 –
なぜ違う動作になっているのか分かりませんが、私はあなたのデザインにコメントしたいと思います:Falseを返すことによって例外を処理しません。例外を伝播させて、呼び出し元に処理させてください。情報を追加したい場合は、Python 3がraise ... from:https://www.python.org/dev/peps/pep-3134/そうでなければ、あなた自身で内部例外を "手動で"ラップすることができます。例えば。 try:asplode()Explosion as e:raise MoreDetailedExplosion( '詳細情報'、e) – allyourcode