summaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-01-23 22:59:58 (GMT)
committerSteven Knight <knight@baldmt.com>2002-01-23 22:59:58 (GMT)
commit315a82d5e0154f6ed33b6848c454c3df61460ea1 (patch)
tree276a3173660b7626ea7dd446a9aba014a81f2afa /src/engine
parent1f0c49dc905310ce09cc790ba2d2b438d07fd846 (diff)
downloadSCons-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.py20
-rw-r--r--src/engine/SCons/Node/__init__.py6
-rw-r--r--src/engine/SCons/Script/__init__.py3
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):