Free Web-Based Exception Reporting
Tsar writes "Promethean Personal Software (makers of Sherpa, a code generating tool for db apps) have quietly released ExceptionCollection, a free (as in beer) online service for developers using any SOAP-enabled environment. You sign up on the site, download their component, add three or four lines of code to your app, and any exceptions thrown by your users get logged at ExceptionCollection.com for your later perusal (the last 100 anyway). There are several options, like whether reporting requires user approval. Is this as cool as it looks, or a solution in search of a problem?"
I don't like exceptions because you have to catch them. Exception based coding is for amateurs.
Real professionals like me, who graduated at the top of his class from Rockhurst College in Kansas City, a top college - pass return codes around rather than do all that exception baloney.
And it is some big time BALONEY.
Why don't you just add one more function to your SOAP server and have your exception handler connect to that?
There is a definite market for something like this. Knowing what exceptions your application is generating at runtime "in the wild" is very valuable to help debug and speed bug fixes.
The only problem is that it would be much more convenient if the exception were sent directly to the application makers instead of to some third party. Microsoft's error reporting system is somewhat like this, but I don't know anyone who actually sends in bug reports when an application crashes in XP. Likewise, Firefox used to have a quality feedback agent, but I never saw it pop up or notify me in any way. Maybe it is silently calling home?
If your users are your testers, it's very important that you get as much detailed information from any problems that arise as you can. Ideally these bugs would have been fixed before it ever hit the doors, but in this day and age of rapid development and short production cycles, it's sometimes better to give a working version to the customer and update it periodically.
Jesus saved me from my past. He can save you as well.
I can't think of any reason NOT to send detailed information about where my application is broken and possibly exploitable to one centralized location that I maintain no control over.
I wonder what they do with their exceptions.
It only allows the developer to see the last 100 exceptions? That might be fine and dandy for a site that only receives 100 hits per day. But when you're running an enterprise-grade site that gets 5 or 6 million hits on a slow day, 100 exceptions will basically be nothing. You could probably sit there and refresh the list of exceptions, getting a completely new list each time.
Cyric Zndovzny at your service.
1. Collect data from unsuspecting users of your SOAP code.
2. Throw an "exception" containing said data.
3. Automatically harvest the data from ExceptionCollection.com.
4. Profit.
I wonder if these people have thought about the insecure/immoral/illegal ways this service could be used and have taken steps to prevent that.
Two wrongs don't make a right, but three lefts do.
This application is better in that it collects all the relevant information into a zip file (including a stack dump), and helps the user to e-mail it to you. It works in C/C++ (Windows only) and doesn't require any third party involvement.
We use it in a deployed product and it works very well.
john
I think I'll stick with recording my exception logs in my own database where I have some measure of security around it, and can look at all of them, not the last 100.
This sounds similar to the BugzScout support in FogBugz (www.fogcreek.com), except that there the errors get sent to your own database on your own web site, and are not limited to the last 100. Definitely cool and valuable to track where your application is breaking, and have the ability to report back to customers whether a specific problem is fixed, being worked on, or needs help to track down.
old style logging. why not just log the exception to a file (as its usually done), and mail it to the programmers at a regular interval. why waste so much of bandwidth, especially in the case where things go horribly wrong and exceptions are thrown just about everywhere.
also, is this mechanism asynchronous ? coz synchronous would mean a lot of latency added to that particular thread, since things are now getting reported to some remote portal.
IMHO, its just another wasteful use of web services. just coz its the fashionable term these days doesn't mean it should be used for all purposes.
web services for exception reporting.....aarrgghhhh !!!
I used to do something like this using my personal web site. I didn't use it for exception reporting -- just for publishing generic statistics about our production stream. I could then monitor them remotely from my cell phone's web browser.
The key thing to be concerned about (as others have observed) is that any messages sent must be sufficiently generic so as not to give away vital information to the outside world.
When I published my stats, I used abbreviations that only I understood followed by percentages. That's it. If someone else saw it, they wouldn't understand it, and, even if they did, it was just non-vital aggregate information that wouldn't do them any good anyway.
This is the maximum level that such exception reporting could (wisely) rise to, and, as such, would be of limited value. I know from my own experience at large companies that log/exception output tends to contain things like userIDs, passwords, and server names, which could easily find itself passed along through these folks' API.
For this reason, it seems like a good service if installed internally, but a bad idea beyond proof of concept for anything larger than a mom-and-pop, where a single programmer knows and understands the whole system and can send sufficiently vague exceptions.
Remember to strip out an connection strings/password etc from you exception info if you're think of using this...
Why you would, I don't know. But still.
Pete
Or? What kind of nerd ARE you?! Duh, it's BOTH!
In fact, a good case could be made that it looks so damn cool BECAUSE it is a solution in search of a problem!
multifariam.net -- yet another nerd blog
Just keeping the exceptions in the logfiles so you can literary put anything in the exception what you want, not having to wonder if some debug information which happens to be equal to a clients transaction wanders around on the network or even the internet. Plus logfiles can be analyzed too, enough handy tools around for that too (I use vi).
My wife's sketchblog Blob[p]: Gastrono-me
if you are going to take the day off school you can start by helping your mum
Exception: Could not handle error: an additonal exception was encountered
...
...
...
...
at com.example.util.BaseExceptionHandler() Line 450
Root Cause:
OutOfMemoryError: Out of memory during exception construction
at Exception() Line 5
Root Cause:
IOException: Could not connect to exceptionollection.com
at com.ExceptionCollection.reportException() Line 127
Root Cause:
ApplicationException: HelloWorld program is too simple
at com.example.webapp.HelloWorld.print() Line 907
I don't know about you guys, but I don't have any bugs in my code. It works perfectly the first time. No doubt. Never happens. Nothing ever breaks. Ever.
p utStream.java:215)p utStream.java:134)j ava:139)j ava:90)1 07)j ava:70)o yment(DeployerService.java:213)r vice.java:430)S ervice.java:1407)e ployerService.java:872)c e.java:890)c hedulerService.java:223)u nnable(ThreadPool.java:426)a :66)
hah.
so there.
at java.util.zip.InflaterInputStream.fill(InflaterIn
at java.util.zip.InflaterInputStream.read(InflaterIn
at java.util.zip.ZipInputStream.read(ZipInputStream.
at java.io.FilterInputStream.read(FilterInputStream.
at jrunx.util.JarUtils.expandJar(JarUtils.java:110)
at jrunx.util.JarUtils.expandJar(JarUtils.java:142)
at jrunx.util.URLUtil.makeExpandedCopy(URLUtil.java:
at jrunx.util.URLUtil.makeExpandedLocalCopy(URLUtil.
at jrun.deployment.DeployerService.createWatchedDepl
at jrun.deployment.DeployerService.deploy(DeployerSe
at jrun.deployment.DeployerService.redeploy(Deployer
at jrun.deployment.DeployerService.redeployChanged(D
at jrun.deployment.DeployerService.run(DeployerServi
at jrunx.scheduler.SchedulerService.invokeRunnable(S
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeR
at jrunx.scheduler.WorkerThread.run(WorkerThread.jav
damnit