On Mar 3, 2011, at 1:46 AM, darkblue_b wrote:
>
>>>
>>> @jonathan: Yes, a more detailed error messages than "no json" would be
>>> awesome.
>>
>> generic.json now says:
>>
>> {{
>> ###
>> # response._vars contains the dictionary returned by the controller action
>> ###
>> try:
>> from gluon.serializers import json
>> response.write(json(response._vars),escape=False)
>> response.headers['Content-Type']='text/json'
>> except:
>> raise HTTP(405,'no json')
>>
>> }}
>>
>> I suggest this instead:
>>
>> {{
>> ###
>> # response._vars contains the dictionary returned by the controller action
>> ###
>> try:
>> from gluon.serializers import json
>> response.write(json(response._vars), escape=False)
>> response.headers['Content-Type'] = 'application/json'
>> except (TypeError, ValueError):
>> raise HTTP(405, 'JSON serialization error')
>> except ImportError:
>> raise HTTP(405, 'JSON not available')
>> except:
>> raise HTTP(405, 'JSON error')
>>
>> }}
>
> I patched that in, and changed the last one to say
>
> except Exception, E:
> raise HTTP(405, 'JSON error: ' + str(E))
>
> and got in my case
> JSON error: 'id'
Ah. Let's find out a little more. I suggest two experiments.
The easier one: include E.__class__.__name__ in the string, so we can see
what's being raised.
Then I'd like to see if we can force a ticket. Try changing the last raise to:
raise SyntaxError, and if you get a stack trace, let's see where the exception
is coming from.
When I took a look through the code, it looked to me like serialization errors
were all causing Type or Value exceptions, but I might have missed something.