Well today, I decided to add a call stack for those times the exception occurs in server script.
Where did I get the call stack from? I noticed that the call stack is displayed when an exception is thrown and we push it to the screen using TheApplication().RaiseErrorText(e), where e is the exception object. So I knew the call stack was available somewhere in that exception object.
Let's hack the exception object and see what it contains. A quick run of this code in the business service simulator was very revealing:
try { TheApplication ().RaiseErrorText ("Hello, World!"); } catch (e) { for (var key in e) Outputs.SetProperty (key, e[key]); }Here are the values that came out:
Property | Value |
errText | Hello, World! |
errCode | 22709 |
name | Error |
message | SiebelError: Hello, World!***RAISE ERROR TEXT*** Error near no filename:159 [RaiseErrorText()]. from no filename:159 [Service_PreInvokeMethod()] |
So I can see that the message property of the exception object houses the message I threw along with the call stack (at least when I threw that exception using RaiseErrorText()). So I can use that to my advantage.
Actually, the construct was something like this:
"SiebelError:" + <error message> + "***RAISE ERROR TEXT***" + <call stack>I didn't really have a need for anything before the call stack, so I stripped out everything up to and including the ***RAISE ERROR TEXT*** bit. So finally, here's the function I wrote to get the call stack.
function GetCallStack () { try { TheApplication ().RaiseErrorText (""); } catch (e) { return (e.message.replace (/^.*\*{3}RAISE ERROR TEXT\*{3}/, ""); } }If that return line looks Chinese to you it's because I am part Chinese. Allow me to translate...
I stripped out the junk prefix by using the string.replace() method to replace unwanted text with an empty string. The unwanted text was expressed as a regular expression, which basically reads, "Everything from the beginning of the line until ***RAISE ERROR TEXT***" So pretty straightforward logically.
Well there you have it! I'll save the primer on regular expressions for another day.