Yes, that is a good idea.
The less we have inside the try block the better.
I was even thinking of moving the semaphores outside:

semTake()
try {
  mongoOp()
}
catch (...) {
  exception = true;
}
semGive()
if (exception)
  errorHandlingAndReturn;

// normal execution continues.

However, I thought of this too late ...
We could add it as an issue of a possible improvement.