I work on a project with a legacy service layer that returns null in many places if a requested record does not exist, or cannot be accessed due to the caller not being auth
Generally it is a good practice to throw a RuntimeException when your code at the higher level can not handle it and can not do anything about the exception.
In your case your API, will return some result if result is successfull, and should return null if there are no results found, and then throw an exception if there is anything that went wrong while performing the operation.
The exception can be Unchecked, if you are just showing the error message to the user and doing nothing more about the problem.
On the otherhand if you plan to take some alternate steps in case of problem, then you should be throwing an checked exception.
For example, I have a code which is like -
Deduct the payment and then Send shipment details. If(sending shipment details is not successfull) then refund the payment else send success mail.
In the above logic, my logic of sending the shipping details should throw an checked exception becase, if there is any problem, then I have to refund the amount to the customer. If in this case I throw an unchecked exception, the only thing that happens that the user might get the error message.(Unless you catch the runtimeexception - Which is bad.)
Thanks, Sathwick
I could be wrong, but it might be connected to the way EJB container handles exceptions. From Best practices in EJB exception handling:
To use the EJB container's internal housekeeping, you will have to have your checked exceptions thrown as unchecked exceptions.
Unchecked exceptions help avoid code clutter. For example consider this code
try
{
File file = new File("file");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String temp = "";
StringBuilder result = new StringBuilder("");
while ((temp = bufferedReader.readLine()) != null)
{
result.append(temp);
}
System.out.println(result);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
We handle two exception types, but if there is no actionable event that can occur by handling these exceptions, why catch them in the first place ? The answer is not to throw the checked exceptions, since eventually some class up the call hierarchy will have to handle it (Or it gets thrown to the JVM). If the developer is really interested in handling these, the catch the specific RuntimeException class that addresses the problem.
Catch blocks that hold multiple exceptions go some way in reducing this clutter
I see the checked/unchecked exception in following perspectives, (taking clue from the standard JDK)
Use Checked exception if you code/library depends on some resource which is external to the JVM (e.g .file/socket/remote api etc i.e JVM has no control over it). Your code MUST handle all the possible error conditions that source may result. This is to make sure that your program is robust and fails gracefully in case something is wrong with that resource.
Unchecked exception are the serious error conditions OR the real BUGS in your code which generally should not be handled AFTER it has occurred. You could correct your code so that this error does not show in the first place. (Eq. NLP, Class cast, Divide by Zero etc)
Though I agree with the view that unchecked exceptions make for a more convenient API, that's not to my mind the most important benefit. Instead it's this:
Throwing unchecked exceptions helps you avoid serious bugs.
Here's why. Given ten developers forced to deal with checked exceptions, you are going to get twenty different strategies for dealing with them, many of which are totally inappropriate. Here are some of the more common bad approaches:
IOException
becomes "Can't connect to the server" even if establishing a connection has nothing to do with the issue.Exception
or (ugh) Throwable
instead of the two checked exceptions that the method actually throws. The exception handling code makes no attempt to distinguish (say) resource availability issues (e.g. some IOException
s) from outright code errors (e.g. NullPointerException
). Indeed it often picks one of the exceptions arbitrarily and misreports every exception as being of that type.Exception
or Throwable
because there's nothing else that would handle all the exceptions being thrown.In my experience it is quite a bit more common to see the approaches above than it is to see a correct response. Many developers--even "senior" developers--have this idea that exceptions must be suppressed at all costs, even if it means running the app in an unstable state. That is dangerously wrong.
Unchecked exceptions help avoid this issue. Developers who don't know how to handle exceptions tend to see exceptions as inconveniences to overcome, and they don't go out of their way to catch them. So the exceptions just bubble up to the top where they offer up a stack trace and where they can be handled in a consistent fashion. In the rare case where there's actually something better to do than let the exception bubble up, there's nothing stopping you.