On 22 июн, 17:48, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Jun 22, 2011, at 3:41 AM, Anton wrote:
>
> > On 22 июн, 01:31, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >> On Jun 21, 2011, at 7:04 PM, Anton wrote:
>
> >>> On 22 июн, 00:47, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >>>> I added StatementError after having too often a custom type or other 
> >>>> kind of error happen deep inside the preparation for execution with no 
> >>>> indication what statement or parameter caused the issue.    It's an 
> >>>> enhancement, and the original exception is associated with the new one 
> >>>> as "orig".   In Python 3 this works even more nicely as you can see 
> >>>> we're doing "raise x from e", and you get both stacktraces.    What 
> >>>> about the StatementError is not working for you ?   I'd advise against 
> >>>> doing things like business-level validations in types.
>
> >>> In my case it's more like sanity check than business-logic. And the
> >>> reason to do this checks in type is that I want to delay it as much as
> >>> possible. It would be acceptable to have another exception instead of
> >>> custom, but the problem is that it is not easy to understand, what's
> >>> went wrong looking at the stack trace. It doesn't show at the last
> >>> line its original exception, only "StatementError: 'query
> >>> text' [params list]".
>
> >> well Python 3 fixes this problem entirely by allowing exception chains.  
> >> What text would you prefer in StatementError ?
>
> > Ideally it would work like it's used to in 0.5 and 0.6. Maybe, we may
> > do it like this:
>
> > +        if isinstance(e, exc.SQLAlchemyError):
> > +            # don't suppress or reraise already handled exceptions
> > +            return
>
> Well, actually I'd like every exception that happens in an execution to 
> include information about the statement, regardless of if a SQLAlchemy 
> construct raised it or not. The very common use case is when a script is 
> emitting hundreds of statements through a flush, then way deep inside, 
> there's one bound value that blows up.     A stack trace like that leads up 
> to a mapper and the unit of work but otherwise gives no context at all about 
> where this offending value might be.    
>
> It's unfortunate we have to wait for Python 3 for chained exceptions, but the 
> practice of reraising an exception as another one, including context, which 
> then links to the original as the "cause", is an extremely common and useful 
> practice - it's why Python 3 added it.
>
> Its unfortunate we disagree on this so I've added a mixin for you in 
> r876ac91fd699 called DontWrapMixin.   StatementError also displays the 
> original exception class.

Excellent, thank you!

--
Anton

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to