about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-10-23T16·45+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-10-23T16·45+0000
commitdd300fb48dd2048d056a5f25dda7d4c1f5515d46 (patch)
tree4f1bb45f6971517b3553ab930e9ec3cc045bcec9 /src/libexpr
parent1d694eef4ce022a99a3fb552804a1f26f686cc55 (diff)
* Some better error messages.
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/nixexpr.cc4
-rw-r--r--src/libexpr/primops.cc13
2 files changed, 12 insertions, 5 deletions
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc
index cb006d147e52..a6cde127c3b2 100644
--- a/src/libexpr/nixexpr.cc
+++ b/src/libexpr/nixexpr.cc
@@ -54,7 +54,7 @@ void queryAllAttrs(Expr e, ATermMap & attrs, bool withPos)
 {
     ATermList bnds;
     if (!matchAttrs(e, bnds))
-        throw TypeError("attribute set expected");
+        throw TypeError(format("value is %1% while an attribute set was expected") % showType(e));
 
     for (ATermIterator i(bnds); i; ++i) {
         ATerm name;
@@ -77,7 +77,7 @@ Expr queryAttr(Expr e, const string & name, ATerm & pos)
 {
     ATermList bnds;
     if (!matchAttrs(e, bnds))
-        throw TypeError("attribute set expected");
+        throw TypeError(format("value is %1% while an attribute set was expected") % showType(e));
 
     for (ATermIterator i(bnds); i; ++i) {
         ATerm name2, pos2;
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 8118f840106f..0f62653b0e9c 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -130,12 +130,19 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
     queryAllAttrs(evalExpr(state, args[0]), attrs, true);
 
     /* Figure out the name already (for stack backtraces). */
+    ATerm posDrvName;
     Expr eDrvName = attrs.get(toATerm("name"));
     if (!eDrvName)
         throw EvalError("required attribute `name' missing");
-    ATerm posDrvName;
     if (!matchAttrRHS(eDrvName, eDrvName, posDrvName)) abort();
-    string drvName = evalStringNoCtx(state, eDrvName);
+    string drvName;
+    try {        
+        drvName = evalStringNoCtx(state, eDrvName);
+    } catch (Error & e) {
+        e.addPrefix(format("while evaluating the derivation attribute `name' at %1%:\n")
+            % showPos(posDrvName));
+        throw;
+    }
 
     /* Build the derivation expression by processing the attributes. */
     Derivation drv;
@@ -190,7 +197,7 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
             }
 
         } catch (Error & e) {
-            e.addPrefix(format("while processing the derivation attribute `%1%' at %2%:\n")
+            e.addPrefix(format("while evaluating the derivation attribute `%1%' at %2%:\n")
                 % key % showPos(pos));
             e.addPrefix(format("while instantiating the derivation named `%1%' at %2%:\n")
                 % drvName % showPos(posDrvName));