Files
whipper-gui/morituri/rip/main.py
chrysn f9af58ed3e main: show TaskException instead of raising them
a TaskException already wraps another exception; raising it gives a
hard-to-read multi-line message instead of showing the clean wrapped
original backtrace; for comparison, an asserton error in image.py line
253:

exception AssertionError at /home/chrysn/git/whipper/morituri/image/image.py:253: stop(): Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)
Traceback (most recent call last):
  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 497, in _startWrap
    task.start(self)
  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 395, in start
    BaseMultiTask.start(self, runner)
  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 330, in start
    self.next()
  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 401, in next
    BaseMultiTask.next(self)
  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 351, in next
    self.stop()
  File "/home/chrysn/git/whipper/morituri/image/image.py", line 253, in stop
    assert taskk.length is not None, "Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)"
AssertionError: Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)

vs.

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/chrysn/git/whipper/morituri/rip/main.py", line 27, in main
    ret = c.parse(sys.argv[1:])
  File "/home/chrysn/git/whipper/morituri/rip/main.py", line 94, in parse
    logcommand.LogCommand.parse(self, argv)
  File "/home/chrysn/git/whipper/morituri/common/logcommand.py", line 62, in parse
    command.Command.parse(self, argv)
  File "/home/chrysn/git/whipper/morituri/extern/command/command.py", line 401, in parse
    return self.subCommands[command].parse(args[1:])
  File "/home/chrysn/git/whipper/morituri/common/logcommand.py", line 62, in parse
    command.Command.parse(self, argv)
  File "/home/chrysn/git/whipper/morituri/extern/command/command.py", line 401, in parse
    return self.subCommands[command].parse(args[1:])
  File "/home/chrysn/git/whipper/morituri/common/logcommand.py", line 62, in parse
    command.Command.parse(self, argv)
  File "/home/chrysn/git/whipper/morituri/extern/command/command.py", line 363, in parse
    ret = self.do(args)
  File "/home/chrysn/git/whipper/morituri/rip/image.py", line 184, in do
    cueImage.setup(runner)
  File "/home/chrysn/git/whipper/morituri/image/image.py", line 75, in setup
    runner.run(verify)
  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 490, in run
    raise TaskException(task.exception, message=msg)
morituri.extern.task.task.TaskException: (AssertionError('Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)',), 'exception AssertionError at /home/chrysn/git/whipper/morituri/image/image.py:253: stop(): Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)\nTraceback (most recent call last):\n  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 497, in _startWrap\n    task.start(self)\n  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 395, in start\n    BaseMultiTask.start(self, runner)\n  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 330, in start\n    self.next()\n  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 401, in next\n    BaseMultiTask.next(self)\n  File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 351, in next\n    self.stop()\n  File "/home/chrysn/git/whipper/morituri/image/image.py", line 253, in stop\n    assert taskk.length is not None, "Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)"\nAssertionError: Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)\n')
2016-11-29 13:30:17 +01:00

98 lines
3.1 KiB
Python

# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4
import os
import sys
import pkg_resources
import musicbrainzngs
from morituri.common import log, logcommand, common, config, directory
from morituri.configure import configure
from morituri.extern.command import command
from morituri.extern.task import task
from morituri.rip import cd, offset, drive, image, accurip, debug
def main():
# set user agent
musicbrainzngs.set_useragent("morituri", configure.version,
'https://thomas.apestaart.org/morituri/trac')
# register plugins with pkg_resources
distributions, _ = pkg_resources.working_set.find_plugins(
pkg_resources.Environment([directory.data_path('plugins')])
)
map(pkg_resources.working_set.add, distributions)
c = Rip()
try:
ret = c.parse(sys.argv[1:])
except SystemError, e:
sys.stderr.write('rip: error: %s\n' % e.args)
return 255
except ImportError, e:
raise ImportError(e)
except task.TaskException, e:
if isinstance(e.exception, ImportError):
raise ImportError(e.exception)
elif isinstance(e.exception, common.MissingDependencyException):
sys.stderr.write('rip: error: missing dependency "%s"\n' %
e.exception.dependency)
return 255
if isinstance(e.exception, common.EmptyError):
log.debug('main',
"EmptyError: %r", log.getExceptionMessage(e.exception))
sys.stderr.write(
'rip: error: Could not create encoded file.\n')
return 255
# in python3 we can instead do `raise e.exception` as that would show
# the exception's original context
sys.stderr.write(e.exceptionMessage)
return 255
except command.CommandError, e:
sys.stderr.write('rip: error: %s\n' % e.output)
return e.status
if ret is None:
return 0
return ret
class Rip(logcommand.LogCommand):
usage = "%prog %command"
description = """Rip rips CD's.
Rip gives you a tree of subcommands to work with.
You can get help on subcommands by using the -h option to the subcommand.
"""
subCommandClasses = [accurip.AccuRip,
cd.CD, debug.Debug, drive.Drive, offset.Offset, image.Image, ]
def addOptions(self):
# FIXME: is this the right place ?
log.init()
log.debug("morituri", "This is morituri version %s (%s)",
configure.version, configure.revision)
self.parser.add_option('-R', '--record',
action="store_true", dest="record",
help="record API requests for playback")
self.parser.add_option('-v', '--version',
action="store_true", dest="version",
help="show version information")
def handleOptions(self, options):
if options.version:
print "rip %s" % configure.version
sys.exit(0)
self.record = options.record
self.config = config.Config()
def parse(self, argv):
log.debug("morituri", "rip %s" % " ".join(argv))
logcommand.LogCommand.parse(self, argv)