When you investigate an issue or a problem you usually get the error or exception message first and then try to replicate that exception in a lower environment such as your local machine. What if there was an error but the application did not produced a message or even a trace where the error occurred? Big problem. One such case to avoid this problem and to avoid passing this problem to the next person that will support your application, is to avoid having suppressed exception on the empty catch block on your code. Yes, having an empty catch block will not be detected by the C# compiler, bummer.
The culprit
public class SilentExceptionSample { public void DivideOperation(int a, int b) { try { var result = a / b; } catch (Exception) { //throw; } } }
The code above is a sample method that does not return anything (void) and an operation to divide a and b. A try catch block will be able to catch any exception that may happen but throwing the exception that may happen is a different scenario. Inside the catch block, the C# compiler allows the block to be empty and not return anything. Most of the time this block can contain a logic to handle the exception such as logging and external error handlers. What happens if the developer leaves the block empty without the intention of leaving it empty? Errors in your application will not have any trace.
Some unit testing
[TestFixture] public class SuppressedExceptions { [Test] public void Division_With_Exception_Test() { var silentException = new SilentExceptionSample(); Assert.Throws(() => silentException.DivideOperation(1,0)); } [Test] public void Division_With_NoException_Test() { var silentException = new SilentExceptionSample(); Assert.DoesNotThrow(() => silentException.DivideOperation(1,1)); } }
I created a unit test to test the exception, on this sample above its the DivideByZeroException, that the method will throw when you divide a number by zero. The test fails in the first scenario since the error suppressed exception on the empty catch block.
Ways to avoid
There can be ways to avoid this code smell. I suggest the following…
Unit Test
– Perform unit tests on exception handling on your code.
Code Snippet
– Use the code snippets on Visual Studio. If you want to use a try catch block, typing in “try” then tab will auto complete the whole block.
Resharper
– Tools such as Resharper can help in detecting code smells. See the warning below from the Resharper engine on the empty catch block.
This type of code smell can be the source of problem you are investigating now or something you can prevent while in development. You’ve been warned! 🙂
Recent Comments