diff options
| author | Steven Knight <knight@baldmt.com> | 2002-01-23 22:59:58 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2002-01-23 22:59:58 (GMT) |
| commit | 315a82d5e0154f6ed33b6848c454c3df61460ea1 (patch) | |
| tree | 276a3173660b7626ea7dd446a9aba014a81f2afa /src/engine | |
| parent | 1f0c49dc905310ce09cc790ba2d2b438d07fd846 (diff) | |
| download | SCons-315a82d5e0154f6ed33b6848c454c3df61460ea1.zip SCons-315a82d5e0154f6ed33b6848c454c3df61460ea1.tar.gz SCons-315a82d5e0154f6ed33b6848c454c3df61460ea1.tar.bz2 | |
Provide a traceback if a Python-function builder throws an exception (Crain).
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/SCons/Node/NodeTests.py | 20 | ||||
| -rw-r--r-- | src/engine/SCons/Node/__init__.py | 6 | ||||
| -rw-r--r-- | src/engine/SCons/Script/__init__.py | 3 |
3 files changed, 28 insertions, 1 deletions
diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index 37b9f37..1050767 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -60,6 +60,10 @@ class ExceptBuilder: def execute(self, **kw): raise SCons.Errors.BuildError +class ExceptBuilder2: + def execute(self, **kw): + raise "foo" + class Environment: def Dictionary(self, *args): pass @@ -91,6 +95,22 @@ class NodeTestCase(unittest.TestCase): else: raise TestFailed, "did not catch expected BuildError" + node = SCons.Node.Node() + node.builder_set(ExceptBuilder2()) + node.env_set(Environment()) + try: + node.build() + except SCons.Errors.BuildError, e: + # On a generic (non-BuildError) exception from a Builder, + # the Node should throw a BuildError exception with + # the args set to the exception value, type, and traceback. + assert len(e.args) == 3, `e.args` + assert e.args[0] == 'foo', e.args[0] + assert e.args[1] is None + assert type(e.args[2]) is type(sys.exc_traceback), e.args[2] + else: + raise TestFailed, "did not catch expected BuildError" + def test_build(self): """Test building a node """ diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index f2d379f..c641895 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -35,6 +35,7 @@ from SCons.Errors import BuildError import string import types import copy +import sys # Node states # @@ -77,7 +78,10 @@ class Node: stat = self.builder.execute(env = self.env.Dictionary(), target = self, source = self.sources) except: - raise BuildError(node = self, errstr = "Exception") + raise BuildError(self, "Exception", + sys.exc_type, + sys.exc_value, + sys.exc_traceback) if stat: raise BuildError(node = self, errstr = "Error %d" % stat) diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py index 1788fab..acbd6c0 100644 --- a/src/engine/SCons/Script/__init__.py +++ b/src/engine/SCons/Script/__init__.py @@ -76,6 +76,9 @@ class BuildTask(SCons.Taskmaster.Task): self.target.build() except BuildError, e: sys.stderr.write("scons: *** [%s] %s\n" % (e.node, e.errstr)) + if e.errstr == 'Exception': + traceback.print_exception(e.args[0], e.args[1], + e.args[2]) raise def executed(self): |
