[ 
https://issues.apache.org/jira/browse/COUCHDB-336?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12706759#action_12706759
 ] 

Brian Candler commented on COUCHDB-336:
---------------------------------------

Sorry, my mistake for using eval instead of evalcx. The problem seems to be 
that evalcx silently catches and discards all errors:

js> evalcx('junk(');
js> evalcx('throw("wobbly")');
js> result = evalcx('throw("wobbly")');
js> typeof result
undefined
js> 

I'll ask about this on dev-tech-javascript. At the moment, the only solution I 
can see is to eval() inside the evalcx(), which is ugly as it involves 
re-escaping the source string.


> Would like errors in map function to be reported to client
> ----------------------------------------------------------
>
>                 Key: COUCHDB-336
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-336
>             Project: CouchDB
>          Issue Type: Wish
>         Environment: svn trunk 0.10.0a768591
>            Reporter: Brian Candler
>            Priority: Minor
>
> At the moment, if a runtime error occurs in a map function, the document is 
> silently excluded from the view and the client is none the wiser.
> $ curl -X PUT http://127.0.0.1:5984/test
> {"ok":true}
> $ curl -d '{"foo":"bar"}' -X PUT http://127.0.0.1:5984/test/doc1
> {"ok":true,"id":"doc1","rev":"1-3413565576"}
> $ curl -d '{"food":"bar"}' -X PUT http://127.0.0.1:5984/test/doc2
> {"ok":true,"id":"doc2","rev":"1-2088327893"}
> # Example 1: map function calls undefined function
> $ curl -d '{"map":"function(doc) { emitt(null,null); }"}' -H 'Content-Type: 
> application/json' -X POST http://127.0.0.1:5984/test/_temp_view
> {"total_rows":0,"rows":[]}
> # Example 2: map function attempts to emit 'undefined'
> $ curl -d '{"map":"function(doc) { emit(doc._id,doc.foo); }"}' -H 
> 'Content-Type: application/json' -X POST http://127.0.0.1:5984/test/_temp_view
> {"total_rows":1,"offset":0,"rows":[
> {"id":"doc1","key":"doc1","value":"bar"}
> ]}
> Of course, errors are available in the server log:
> [Tue, 28 Apr 2009 08:40:39 GMT] [info] [<0.1276.0>] OS Process Log Message: 
> function raised exception (ReferenceError: emitt is not defined) with doc._id 
> doc1
> [Tue, 28 Apr 2009 08:43:44 GMT] [info] [<0.1276.0>] OS Process Log Message: 
> function raised exception (Cannot encode 'undefined' value as JSON) with 
> doc._id doc2
> But the client cannot see these, and worse, gets what appears to be a valid 
> result set.
> I think there are two cases to consider.
> - in temporary views, it ought to be easy to do something: e.g. (1) return 
> the full set of failed docs with their errors, or (2) return a count of 
> failed docs, or (3) just abort on the first error
> - in permanent views, it might also be useful to return this information, but 
> it could be expensive to persist. Also, when you're querying for key X you 
> might not want to see a whole load of errors for unrelated docs. An error 
> count might be OK though, similar to total_rows.
> The current behaviour may be useful, although I personally wouldn't want to 
> rely on it, especially as it generates errors in the log. That is, I would 
> rather be forced to rewrite example 2 as
>   function(doc) { if (doc.foo) { emit(doc._id, doc.foo); } }
> or
>   function(doc) { emit(doc._id, doc.foo || null); }
> as appropriate.
> Workaround: users can manually wrap each of their map functions in a catcher 
> which emits a sentinel key/value pair containing the error. However they 
> would still have to query the key range which includes the error messages.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to