を使用
raise mercurial.error.Abort()
を使用すると、ui.traceback
がTrue
(デフォルトはFalse
)に設定されていない限り、トレースバックは発生しません。 Abort()
を上げると、通常(255終了コードになり)ui.warn('abort: ' + msg_from_exception)
とreturn -1
コンボになり:私は明示的にトレースバックを有効にする必要がありました
$ cat demo.py
from mercurial import cmdutil, error
cmdtable = {}
command = cmdutil.command(cmdtable)
@command('demo1', [], '')
def demo1(ui, repo, *args, **opts):
ui.warn('Error message written directly to ui.warn')
return 1
@command('demo2', [], '')
def demo2(ui, repo, *args, **opts):
raise error.Abort('Error message raised with Abort')
$ hg --config extensions.demo=`pwd`/demo.py demo1
Error message written directly to ui.warn
$ echo $?
1
$ hg --config extensions.demo=`pwd`/demo.py demo2
abort: Error message raised with Abort
$?
255
$ hg --config extensions.demo=`pwd`/demo.py --config ui.traceback=true demo2
Traceback (most recent call last):
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 204, in _runcatch
return _dispatch(req)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 880, in _dispatch
cmdpats, cmdoptions)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure
return func(*(args + a), **kw)
File "/opt/facebook/hg/lib/python2.7/site-packages/fastmanifest/cachemanager.py", line 318, in runcommandtrigger
result = orig(*args, **kwargs)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure
return func(*(args + a), **kw)
File "/opt/facebook/hg/lib/python2.7/site-packages/fastmanifest/__init__.py", line 174, in _logonexit
r = orig(ui, repo, cmd, fullargs, *args)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure
return func(*(args + a), **kw)
File "/opt/facebook/hg/lib/python2.7/site-packages/hgext/journal.py", line 79, in runcommand
return orig(lui, repo, cmd, fullargs, *args)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 637, in runcommand
ret = _runcommand(ui, options, cmd, d)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure
return func(*(args + a), **kw)
File "/opt/facebook/hg/lib/python2.7/site-packages/hgext/pager.py", line 160, in pagecmd
return orig(ui, options, cmd, cmdfunc)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure
return func(*(args + a), **kw)
File "/opt/facebook/hg/lib/python2.7/site-packages/hgext/color.py", line 503, in colorcmd
return orig(ui_, opts, cmd, cmdfunc)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 1010, in _runcommand
return checkargs()
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 971, in checkargs
return cmdfunc()
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 877, in <lambda>
d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/util.py", line 1036, in check
return func(*args, **kwargs)
File "/tmp/demo/demo.py", line 13, in demo2
raise error.Abort('Error message raised with Abort')
Abort: Error message raised with Abort
abort: Error message raised with Abort
注意! Pythonで
、bool
タイプはint
のサブクラスであり、そしてTrue
は1
の値を有し、False
は0
の整数値を有します。 Mercurialは、@command
関数が終了コード(または終了コード0の場合はNone
)を設定する整数を返すと予想しているため、True
を返して終了コードを1
に設定します。
一般に、mercurial.commands
モジュールとさまざまなhgext
拡張モジュールを調べて、他の人が特定の問題をどのように解決したかを確認します。 hg grep
コマンドは、例えば、エラーを処理する。この例が含まれています
try:
regexp = util.re.compile(pattern, reflags)
except re.error as inst:
ui.warn(_("grep: invalid match pattern: %s\n") % inst)
return 1
hg addremove
コードがerror.Abort()
を発生させながら:
try:
sim = float(opts.get('similarity') or 100)
except ValueError:
raise error.Abort(_('similarity must be a number'))
私はコマンドエラーのためerror.Abort()
、およびui.warn()
プラス帰国を使用したいです255以外の終了コードが必要な場合にのみ、整数を返します。
なぜコマンドが「True」を返すのですか? '@ command'の戻り値は終了コードとして解釈され、Pythonでは' True == 1'と解釈されます。 –