Indeed it is possible Melvin. I read through those links, and I am afraid I wasn't clear enough.
IF (important_variable is NULL) THEN RAISE EXCEPTION 'important_variable must not be NULL.'; END IF;
--
If Postgres throws an exception, we can handle it and get the context, which will allow us to pinpoint exactly where the problem was, and what functions were called leading up to the error. However, we are trying to add our own manually RAISED exceptions for particular circumstances. And in that case, I can "catch" the exception, but there is no context associated with it. I'm looking for a workaround to tide me over until this is fixed.
Example: We have some functions that take a JSON parameter, extract some values, and will eventually insert those values into the database. If a property isn't set on the JSON that gets passed into that function, that parameter is null, and we'll eventually see an error because the INSERT into the database violates a NOT NULL constraint. Since Postgres threw that error, I can handle that exception and return the context, showing me where to look. Through debugging, _eventually_ figure out that the developer might not have passed in the appropriate JSON data into the function (vs many other reasons we could have seen a NOT NULL constraint error). So, I would rather put a check like this at the top of my function:
--
important_variable = (p_request::json->>'important_variable')::integer;IF (important_variable is NULL) THEN RAISE EXCEPTION 'important_variable must not be NULL.'; END IF;
--
But I won't be able to get the context for that exception, and all I'll be able to return from the function or write to the logs is 'important_variable must not be NULL.'. If that's the only place I throw that error, I'll know where to look. Otherwise, I have no context, and won't be able to determine where my exception was thrown. So I'm actually better off _not_ throwing my own custom exceptions, even though I would prefer to be more defensive about this sort of thing in my code.
I thought I might be able to "trick" postgres into throwing another unrelated exception that would not only include my custom error message, but allow me to extract the context, telling me the function where I should begin debugging.
Many thanks,
Taylor
On Thu, Apr 2, 2015 at 10:45 AM, Melvin Davidson <melvin6925@xxxxxxxxx> wrote:
I believe the availability of trapping the error codes and raising the appropriate messageis already in PLPGSQL. Please see the two sections below.On Thu, Apr 2, 2015 at 12:01 PM, Taytay <taylor@xxxxxxxxxxxxxxxxxx> wrote:There appears to be a fair amount of nuance here, but I am _very_ impressed with how quickly you have responded. Thank you for your quick attention to this issue! (Yet another thing that makes me happy to be using Postgres).We have fair amount of business logic in Postgres functions, and the ability to throw and catch exceptions, and pinpoint their source location in our logs, will be _very_ helpful for us. I look forward to it.This is perhaps a separate discussion, but as I await this patch, I'm looking for a way to "trick" Postgres into throwing an exception that will include a string of my choosing. Something like "SELECT 'This is an exception' / 0 "That would give me a "real" exception that is not subject to this filtering, and if the error message was "Divide by zero: 'This is an exception cannot' / 0"I'm totally making that up of course, but you see what I'm getting at. Does someone with better Postgres/SQL knowledge know of such an exception?Thanks again,TaylorOn Thu, Apr 2, 2015 at 2:07 AM, Pavel Stehule [via PostgreSQL] <[hidden email]> wrote:The OP on this thread has introduced a potential compromise. Keep the current printing behavior for RAISE but the construction of the error itself should contain all of the relevant detail so that the caller can get to the suppressed information via, in this instance, GET STACKED DIAGNOSTICS inside an exception handler - a situation where the error is in context but has not yet been printed.Giving the function author the ability, via a new using clause, to bypass the printing short-circuit is another feature to consider.I haven't fully comprehended the design decisions and trade-offs but omitting data to facilitate printing doesn't sound like an appropriate solution - not that I have any clue how hard it would be separate the two aspects. Likewise with adding in a short-circuit that is judgemental without providing some means to bypass it. We are not talking about data integrity or performance here and while I'll admit reducing verbosity is a valid goal mis-use of a provided work-around mechanic is not that serious a transgression and one readily noticed and somewhat readily corrected.There is more aspects - current behave is too simply fix - but it works almost time. We can enhance a RAISE statement, but default behave should be practical. Usually we don't need stack for NOTICE level (and maybe for WARNING level) and usually we would to have stack for EXCEPTION level. Now, there is workaround due GET DIAGNOSTICS STACK, but it is workaround - and the enhancing of GET DIAGNOSTICS was not designed for this purpose. Sure, there are more variant of fixing - and we can implement more than one.RegardsPavelDavid J.
If you reply to this email, your message will be added to the discussion below:http://postgresql.nabble.com/Why-doesn-t-RAISE-EXCEPTION-provide-error-context-tp5844382p5844393.html
View this message in context: Re: Why doesn't `RAISE EXCEPTION` provide error context?
Sent from the PostgreSQL - general mailing list archive at Nabble.com.
--Melvin Davidson
I reserve the right to fantasize. Whether or not you
wish to share my fantasy is entirely up to you.