The framework in the foundation of apps created with
Code On Time provides a unified error reporting mechanism that can be utilized to perform a global exception logging.
Error Logging
Create the following table in your database to keep track of runtime errors.
create table Errors(
ErrorID uniqueidentifier not null primary key,
ErrorDate datetime default getdate(),
UserName nvarchar(128),
Details ntext
)
Select your project on the start page of the app builder and choose
Visual Studio. Create a code file in the
~/App_Code/cust0m folder and enter the following code:
namespace MyCompany.Services
{
public partial class ApplicationServices
{
protected override void HandleError(HttpContext context, Exception er)
{
// log all uncaught exceptions reported by application
LogError(new JObject(), er);
}
public static Guid LogError(JObject errorDetails, Exception ex)
{
// add exception to the details
var error = new JObject();
error["message"] = ex.Message;
error["type"] = ex.GetType().FullName;
error["source"] = ex.Source;
error["stack"] = ex.StackTrace;
errorDetails["exception"] = error;
// configure error details
var errorID = Guid.NewGuid();
var details = errorDetails.ToString();
var userName = BusinessRulesBase.UserName;
// log error in the database
using (var q = new SqlText(
"insert into Errors(ErrorID, Details, UserName) " +
"values(@ErrorID, @Details, @UserName) "))
q.ExecuteNonQuery(new { errorID, details, userName });
return errorID;
}
}
}
Error details inherited from the exception will be transcribed in JSON format.
Note that the partial class
ApplicationServices is not available in the
Trial Edition. You will need a commercial version of the app generator to override the methods of the partial framework classes.
Method
ApplicationServices.HandleError is invoked by application framework when the incoming requests have resulted in the application exception that was not handled. The code above will automatically capture all uncaught exceptions. Create a data model for the
Errors table and design your own GUI to allow administrative review of error messages.
Custom Error Reporting
Some exceptions are handled by the framework and reported to the end user to avoid rendering the application inoperable. For example, the error is reported to the user as-is if there was an exception when saving data. The user may cancel the data input form and continue working with the app.
Database engine error may be cryptic and impossible to decipher. Developer can choose to “translate” such errors to the user and/or log them in the database for review by administrator.
Create another “code” file in the
~/App_Code/custom folder of your app.
Enter the following code to replace the default error reporting by data controllers. We are using
ApplicationServices.LogError method created above to log errors.
using MyCompany.Data;
using Newtonsoft.Json.Linq;
using System;
using System.Web;
using MyCompany.Services;
namespace MyCompany.Data
{
public partial class Controller
{
protected override void HandleException(Exception ex, ActionArgs args, ActionResult result)
{
// by default the exception is reported to the user in result.Errors property
base.HandleException(ex, args, result);
// log error in the database
var errorDetails = new JObject();
errorDetails["args"] = JObject.FromObject(args);
var errorID = ApplicationServices.LogError(errorDetails, ex);
// replace the error message reported to the user with a custom error
if (result.Errors.Count > 0)
{
result.Errors.Clear();
result.Errors.Add(string.Format("Error {0}. Please contact the Help Desk.", errorID));
}
}
}
}
Error details will include the JSON definition of arguments including field values that caused the exception.
From now on any errors reported to the user will appear like this: