Description

The exception itself should not be ignored because it can be affected to regular program flow. There are three exception types (logical groups):

  • Usage exceptions. Means you try to use method with wrong parameters. Validate method parameter at first and throw such exception BEFORE main code. Never catch or handle it.
  • System exceptions. Raised when something abnormal happened inside the method main code and not related from caller. Generally it is required to re-throw exception up. Catch it only: it is possible to compensate results, make a workaround actions; on the application top level to avoid user from stress from exception technical detals; to wrap original exception into custom exception type.
  • Application exceptions like NullReferenceException, InvalidOperation etc. These are about logic problem in code. You can handle its with the same reasons as for system exceptions.

try
{
    CalledMethod("Test");
}
// DO NOT CATCH USAGE EXCEPTION
catch (ArgumentNotSpecifiedException ex)
{
    // special handling for ArgumentNotSpecifiedException
}
catch (Exception ex)
{
    // log it
    throw new WrappedException("Method XXX call  error occurred", ex); // wrapped & chained exceptions.
}
finally
{
    // normal clean goes here (like closing open files).
}



// Validate parameter and throw "usage exception"
if (String.IsNullOrEmpty(p1))
    throw new ArgumentNotSpecifiedException("Parameter p1 must be specified");

// Here we save data to the storage and the "system exception" could be raised
try
{
    DAL.Save(p1);
}
catch (SqlException e)
{
    if (e.ErrorCode != NO_ROW_ERROR)
    {
        // filter out NoDataFound.
        // do special cleanup, like maybe closing the "dirty" database connection.
        // throw e; <- DO NOT DO IT. This destroys the strack trace information!
        throw; // this preserves the stack trace
    }
}


In case of logging handle exception with re-throw. It will allow to take a decision on the upper level.

Resolution

  • If method has a side-effect it is strongly recommended to avoid ANY exception suppressions, not only specific type.
  • Specify exception type in the catch clause. Mostly it could be SPException.
  • Rethrow exception in catch(Exception) block using throw or catch specific exception.

Links