On Wed, 9 Dec 2020 at 01:59, James Cook <[email protected]> wrote:
> On Wed, 9 Dec 2020 at 01:55, James Cook <[email protected]> wrote: > >> I've noticed that sometimes when plugin code triggers a runtime error, I >> don't get a stack trace. Here's a made-up minimal-ish example: >> >> from beancount.core import amount, data, number >> __plugins__ = ("foo",) >> def foo(entries, _options): >> return [data.Transaction( >> flag = "*", >> payee = None, >> narration = "", >> tags = "", >> links = set(), >> postings = [data.Posting("Equity:Foo", >> amount.Amount(number.D("10"), "CAD") + "X", None, None, None, None)] >> )], () >> >> If I run bean-check on a file that imports that plugin, I just get this >> output: >> >> falsifian angel beancount $ PYTHONPATH=./plugins bean-check >> main.beancount >> <load>:0: Error importing "foo": can only concatenate tuple (not >> "str") to tuple >> >> On the other hand, if I replace the body of foo() with 'raise >> BaseException("error")', I get a nice stack trace: >> >> falsifian angel beancount $ PYTHONPATH=./plugins bean-check >> main.beancount >> Traceback (most recent call last): >> File "/home/falsifian/.local/bin/bean-check", line 11, in <module> >> load_entry_point('beancount==2.3.3', 'console_scripts', >> 'bean-check')() >> File >> "/home/falsifian/.local/lib/python3.8/site-packages/beancount/scripts/check.py", >> line 49, in main >> entries, errors, _ = loader.load_file( >> File >> "/home/falsifian/.local/lib/python3.8/site-packages/beancount/loader.py", >> line 89, in load_file >> entries, errors, options_map = _load_file( >> File >> "/home/falsifian/.local/lib/python3.8/site-packages/beancount/loader.py", >> line 214, in wrapped >> result = function(toplevel_filename, *args, **kw) >> File >> "/home/falsifian/.local/lib/python3.8/site-packages/beancount/loader.py", >> line 255, in _uncached_loa >> d_file >> return _load([(filename, True)], *args, **kw) >> File >> "/home/falsifian/.local/lib/python3.8/site-packages/beancount/loader.py", >> line 510, in _load >> entries, errors = run_transformations(entries, parse_errors, >> options_map, >> File >> "/home/falsifian/.local/lib/python3.8/site-packages/beancount/loader.py", >> line 588, in run_transform >> ations >> entries, plugin_errors = callback(entries, options_map) >> File >> "/home/falsifian/w/colin_and_james/accounting/beancount/plugins/foo.py", >> line 4, in foo >> raise BaseException("error") >> BaseException: error >> >> Why does that happen? Is there a way I can get a stack trace more >> consistently? It would help me debug. >> >> James >> > > I mostly answered my own question. If I really want a traceback, I can > just catch the exception before foo() returns. Hacky example that uses > traceback.format_exc() to show the stack trace: > > from beancount.core import amount, data, number > import traceback > __plugins__ = ("foo",) > def foo(entries, _options): > try: > return [data.Transaction( > flag = "*", > payee = None, > narration = "", > tags = "", > links = set(), > postings = [data.Posting("Equity:Foo", > amount.Amount(number.D("10"), "CAD") + "X", None, None, None, None)] > )], () > except BaseException: > traceback.format_exc() > Er, apparently I don't know what the above line does. I think the reason this worked for me is just that I changed the type of the exception to something beancount doesn't catch. > raise BaseException("error") > > James > -- You received this message because you are subscribed to the Google Groups "Beancount" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/CAHpmPOAc80mZZdTc%2Bqfnr-r3HLfSetpmmEbGpr7BTJ3UZmEVXQ%40mail.gmail.com.
