Small Java question regarding object instantiation and logging please.
In our (way too big) project we have one particular exception MyCustomException which is thrown.
The usual code will be something like:
if (conditionNotMet()) { throw new MyCustomException();
try { } catch (SomeException e) { throw new MyCustomException();
There are a good thousands of throws of this kind. And for all of them, we would like to add logging, something like:
if (conditionNotMet()) { LOGGER.error(something bad happened, throwing a new MyCustomException()); throw new MyCustomException();
try { } catch (SomeException e) { LOGGER.error(something bad happened, throwing a new MyCustomException()); throw new MyCustomException();
As you can imagine, since we have thousands and thousands of those, we are wasting tremendous times adding the LOGGER in all the places.
I was wondering, is there some kind of annotation we can put on the MyCustomException, something like:
@LogMeWhenIamCreated public MyCustomException(...) {
So we can put this annotation in only one place, and still be able to see the logs we want, without us having to go through the entire code base and the thousands of throws?
Thank you
Advertisement
Answer
I see three options here:
- Use AOP to handle creation of
MyCustomException
. Follow this answer to see how you can write the aspect for class creation. It’s also possible to write aspect for@LogMeWhenIamCreated
annoptation. - Use regex to find all
throw new MyCustomException();
constructions and add logging before throwing. The disadvantage is obvious – a lot of changes. - Add logging to the
MyCustomException
constructor as Rohan suggested.
The disadvantage for options 1 and 2: if you have places where you construct the exception and don’t throw it, the log message will still be added.