The previous article explained how important it is to have a Base exception class that can be used through out your application. In this article, let us examine what Exception Management stategy can be built for these Enterprise Applications. Let us suppose that the strategy we design must take care of the following points:
1. Any Exception raised in any of the Layers must be Logged. 2. The custom error page exposed by the Presentation Layer must also indicate some sort of context information (Either about the Module or some specific type of exception).
The second point is important because in a large application, its certainly difficult to track which module caused the exception. So if the custom error page contains some context specific information about the module that caused the exception, handling the exception would be easy.
So taking into consideration the above points, the following strategy can be designed:
1. Design specific custom Exception classes for each module that inherits from the MyAppBaseApplicationException class. Any exception that occurs in that module will be wrapped using this Exception class.
2. Any exception that occurs throught out your application will therefore be wrapped with the corresponding class and logged. Once the exception is logged, the isLogged flag of the base exception class will be set to true.This will avoid logging again on the higher layers.
3. The logging will happen to the database by default and if the database access fails, the error messages will be logged to Windows event log.
4. After the exceptions are logged the wrapped exceptions are then re-thrown to the next higher layer.
5. In the final layer, you will therefore have only the wrapped exceptions or the exception that occurs in the Presentation layer.
6. The custom error page in the Presentation layer can be shown with customised error messages for each module.
A sample custom exception class for the Data Access module is shown below:
public class DataOperationFailedException:MSTRBaseApplicationException
private int sqlErrorNumber;
private string sqlServerName;
private string storedProcName;
private int lineNumber;
//Add properties to access the private variables
Code Snippet Continued in my Next Post.