2016-08-04 8 views
0

Mercurial 확장에서 오류를 처리하는 데 권장되는 방법은 무엇입니까? 온라인에서이 부분에 대한 문서를 찾을 수 없습니다.Mercurial 확장에서 오류를 처리하는 방법

다음 예제는 Hello world을 인쇄하고 Windows 셸에서 errorlevel1으로 설정합니다.

@command('print-parents', [('','', None, '')], '') 
def printparents(ui, repo, node, **opts): 
    print "Hello world" 
    return True 

1-errorlevel 세트는 무엇입니까? 우리는 그것이 0 일 것으로 예상했습니다. 이 문맥에서 파이썬이나 머큐리얼은 TrueFalse을 어떻게 처리합니까? False을 반환하면 errorlevel0가 생성됩니다.

우리는 raise error.Abort(..)의 몇 가지 예제를 보았지만이 출력은 매우 자세한 호출 스택을 필요로하지 않습니다. 간단한 문자 메시지와 올바른 errorlevel이 필요합니다. 그러나

if something_is_wrong: 
    ui.warn(_('Something is wrong, please correct this')) 
    return 1 

하십시오 @command 기능에서 Windows 7 및 의욕 3.4.1

+0

왜 명령이 'True'를 반환합니까? '@ command'의 반환 값은 종료 코드와 파이썬에서 'True == 1'로 해석됩니다. –

답변

0

를 사용

, 오류 메시지가 표시 ui.warn()를 사용한 후 종료 코드를 설정하는 정수를 값을 반환 , raise mercurial.error.Abort()을 사용하면 ui.tracebackTrue (기본값은 False)으로 설정되어 있지 않으면 추적 표시가되지 않습니다. Abort()를 올리면 일반적으로 (255 종료 코드 결과)를 ui.warn('abort: ' + msg_from_exception)return -1 콤보 결과 : I 명시 적으로 역 추적을 가능하게했다

$ 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 

주의! 파이썬

boolint 타입의 서브 클래스와는 True1의 값을 가지며이 False0의 정수 값을 갖는다. Mercurial은 @command 함수가 종료 코드 (또는 종료 코드 0에 대해 None)를 설정하는 정수를 반환 할 것으로 예상하므로 True을 반환하여 종료 코드를 1으로 설정합니다.

일반적으로 mercurial.commands 모듈과 다양한 hgext 확장 프로그램을 검토하여 다른 사람들이 특정 문제를 어떻게 해결했는지 알아 봅니다. hg grep 명령은, 예를 들어, 오류 처리의 예를 포함

try: 
    sim = float(opts.get('similarity') or 100) 
except ValueError: 
    raise error.Abort(_('similarity must be a number')) 

내가 명령 오류 error.Abort()를 사용하는 것, 그리고 ui.warn() 플러스를 반환 :

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()을 제기하면서 255가 아닌 종료 코드가 특별히 필요한 경우에만 정수입니다.

+0

아주 좋은 설명, 감사합니다 :-) – Lars