Instead of writing the try and catch throughout the
application, global.asax , application_error method is the common place to handle
all the error and based on the type of exception it will redirect to the page.
Code snippet : For
Gloab.asax page
·
Exception ex = Server.GetLastError();
It helps to get the last exception of the application that application
find.
·
routeData.Values.Add("controller", "Error");
Registered the
controller error for routing data.
·
Now here it is checking the types of error got
in application as 401, 404 etc
if (((HttpException)ex).GetHttpCode() ==
404)
{
routeData.Values.Add("action", "PageNotFound");
}
·
Final code to execute the controller requert and
redire t to particular controller and action.
errorController.Execute(new RequestContext(new HttpContextWrapper(Context),routeData));
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
Guid ErrorId = Guid.NewGuid();
routeData.Values.Add("ErrorId", ErrorId);
Response.Clear();
if (ex is HttpException)
{
if (((HttpException)ex).GetHttpCode() == 404)
{
routeData.Values.Add("action", "PageNotFound");
}
else if (((HttpException)ex).GetHttpCode() == 401)
{
routeData.Values.Add("action", "UnAuthorized");
}
else
{
routeData.Values.Add("ErrorValue", ex);
routeData.Values.Add("action", "Index");
}
}
else if (ex is Exception)
{
routeData.Values.Add("ErrorValue", ex);
routeData.Values.Add("action", "Index");
}
// LogHelper.ErrorLog(ErrorId.ToString(),ex);
//Clear error in server
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
// Call the target controller and pass the
route data
IController errorController = new
WebApplication2.Controllers.ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context),routeData));
}
Code snippet : For Error
controller to get details in MVC
We will have three different
action to handle three different type of error as 404, 401 and server error.
·
Code will use to get the exception detail in
server side exception and which will use to display in DIV
Exception exception = this.RouteData.Values["ErrorValue"] != null ? (Exception)this.RouteData.Values["ErrorValue"] : null;
·
It converts the request type to html to display
in the page.
Response.ContentType
= "text/html";
public class ErrorController : Controller
{
//
GET: Error
public ActionResult Index()
{
Response.ContentType = "text/html";
try
{
Exception exception = this.RouteData.Values["ErrorValue"] != null ? (Exception)this.RouteData.Values["ErrorValue"] : null;
string errorId = this.RouteData.Values["ErrorId"].ToString();
string message = exception != null ?
exception.Message.ToString() : "Undefined Error";
string stackTrace =
exception.StackTrace.ToString();
ViewBag.ErrorId = errorId;
ViewBag.Message = message;
ViewBag.StackTrace =
stackTrace;
}
catch (Exception ex)
{
Guid ErrorId = Guid.NewGuid();
ViewBag.ErrorId = ErrorId;
ViewBag.Message = ex.Message.ToString();
ViewBag.StackTrace =
ex.StackTrace.ToString();
//
LogHelper.ErrorLog(ErrorId.ToString(),ex);
}
return View();
}
public ActionResult PageNotFound()
{
Response.ContentType = "text/html";
return View();
}
public ActionResult UnAuthorized()
{
Response.ContentType = "text/html";
return View();
}
}
Code snippet : For Server
side exceptions in MVC for Index.cshtml
·
It Use to hide and show the actual error from
outside.
<a href="javascript:void(0)" onclick="ShowErrorDetail();" style="text-decoration:none">@ViewBag.ErrorId</a>
<div class="form-group">
<div class="row">
<div class="col-md-10
col-md-offset-1 headerText">
Technical Fault
</div>
</div>
<br /><br />
<div class="col-lg-12
col-sm-12 col-md-12">
<div class="form-group
text-center">
<div class="alert alert-info" style="font-size:14px;font-weight:bold;">
Please retry the same operation
again. If you are facing problem concistently please contact administrator with
below Id.
<br />
<a href="javascript:void(0)" onclick="ShowErrorDetail();" style="text-decoration:none">@ViewBag.ErrorId</a>
</div>
</div>
</div>
<br />
<div class="col-lg-12
col-sm-12 col-md-12">
<div class="form-group
text-center" id="ErrorDetail" style="display:none">
<div class="alert alert-danger">
<b>@ViewBag.Message</b>
@ViewBag.StackTrace
</div>
</div>
</div>
</div>
<script type="text/javascript">
function ShowErrorDetail()
{
$("#ErrorDetail").toggle();
}
</script>
Onclicking the Unique Id it will look like below.
No comments:
Post a Comment