protected override void OnException(ExceptionContext filterContext) { //TODO: подумать о том чтобы делать параметризированный ендВорк без савечангес var exception = filterContext.Exception; Logger.Write("Message: " + exception.Message + "\r\n Data: \r\n" + exception.Data + "\r\n Trace:\r\n" + exception.StackTrace, "Exceptions", 0, 32667, TraceEventType.Error);//TODO: подкрутить вывод в лог #region Системные ошибки if (exception is SystemException) { var result = new ViewResult//TODO: Глобальная ошбика, например отключение бд, привелет к показу! Нужно редиректить на специальный лайаут, без пользовательских данных, который точно не ебнеться, и адльше смотреть, если нет коннекта к БД писать прямо об этом { ViewName = "Error", MasterName = "", ViewData = null, TempData = filterContext.Controller.TempData }; result.ViewBag.Exception = exception; result.ViewBag.ExceptionText = "Возникла ошибка, обратитесь к команде разработчиков через <a href='" + Url.Action("index", "feedback") + "'>форму обратной связи</a> или по <a href='mailto:[email protected]'>email</a>"; filterContext.Result = result; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; } #endregion #region Ошибки приложения if (exception is ApplicationException) { #region Ошибки редиректа if (filterContext.Exception is RedirectException) { RedirectException redirectException = (RedirectException)filterContext.Exception; string url = ""; if (!string.IsNullOrWhiteSpace(redirectException.RedirectUrl)) { url = redirectException.RedirectUrl; } else { url = ConstHelper.HomeUrl; } List <string> urlParameters = new List <string>(); if (!String.IsNullOrEmpty(redirectException.Message)) { urlParameters.Add(ConstHelper.ErrorCode + "=" + ErrorService.Add(redirectException.Message)); } if (filterContext.Exception is AuthenticationException) { urlParameters.Add("returnUrl" + "=" + HttpUtility.UrlEncode(HttpContext.Request.Url.ToString()));//TODO: вынести returl или внести ErrorCode } StringBuilder finallyUrl = new StringBuilder(url); finallyUrl.Append("?"); for (int i = 0; i < urlParameters.Count; i++) { finallyUrl.Append(urlParameters[i]); if (i != urlParameters.Count - 1) { finallyUrl.Append("&"); } } filterContext.Result = new RedirectResult(finallyUrl.ToString()); filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; return; } if (filterContext.Exception is MvcActionRedirectException) { MvcActionRedirectException mvcRredirectException = (MvcActionRedirectException)filterContext.Exception; var result = RedirectToAction(mvcRredirectException.ActionName, mvcRredirectException.ControllerName, mvcRredirectException.RouteValues); if (!String.IsNullOrEmpty(mvcRredirectException.Message)) { result.RouteValues.Add(ConstHelper.ErrorCode, ErrorService.Add(mvcRredirectException.Message)); } filterContext.Result = result; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; return; } #endregion #region Ошибки ведущие на остование на этой же странице #region Ошибки бизнес логики //чтобы заюзать внутренний кеш, можно поробовать обкаст к коетроллер акстион енвокер if (filterContext.Exception is BusinessLogicException) { BusinessLogicException businessLogicException = (BusinessLogicException)filterContext.Exception; var controllerDescriptor = new ReflectedControllerDescriptor(GetType()); string actionName = RouteData.GetRequiredString("action"); ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(ControllerContext, actionName); IDictionary <string, object> parameters = GetParameterValues(ControllerContext, actionDescriptor); object model = null; if (parameters.Keys.Contains("model")) { model = parameters["model"]; } var viewResult = new ViewResult { ViewName = "", MasterName = "", ViewData = new ViewDataDictionary(model), TempData = filterContext.Controller.TempData }; viewResult.ViewBag.Exception = businessLogicException; viewResult.ViewBag.ExceptionText = String.Format(businessLogicException.Message); ControllerContext context = ControllerContext; try { viewResult.ExecuteResult(context); } catch//TODO: URLREFERER case { //if (HttpContext.Request.UrlReferrer != null) //{ // if(Core.UrlHelper.IsInnerUrl(HttpContext.Request.UrlReferrer.ToString())) // { // } //} //else //{ var result = new ViewResult//TODO: Глобальная ошбика, например отключение бд, привелет к показу! Нужно редиректить на специальный лайаут, без пользовательских данных, который точно не ебнеться, и адльше смотреть, если нет коннекта к БД писать прямо об этом { ViewName = "Error", MasterName = "", ViewData = null, TempData = filterContext.Controller.TempData }; result.ViewBag.Exception = businessLogicException; result.ViewBag.ExceptionText = String.Format(businessLogicException.Message); filterContext.Result = result; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; return; //} } filterContext.Result = viewResult; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; return; } #endregion #region Ошибки валидации //чтобы заюзать внутренний кеш, можно поробовать обкаст к коетроллер акстион енвокер if (filterContext.Exception is ValidationException) { ValidationException validationException = (ValidationException)filterContext.Exception; var controllerDescriptor = new ReflectedControllerDescriptor(GetType()); string actionName = RouteData.GetRequiredString("action"); ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(ControllerContext, actionName); IDictionary <string, object> parameters = GetParameterValues(ControllerContext, actionDescriptor); object model = null; if (parameters.Keys.Contains("model")) { model = parameters["model"]; } var viewResult = new ViewResult { ViewName = "", MasterName = "", ViewData = new ViewDataDictionary(model), TempData = filterContext.Controller.TempData }; viewResult.ViewBag.ValidationException = validationException; viewResult.ViewBag.ValidationExceptionText = String.Format(validationException.Message); //viewResult.ExecuteResult(); filterContext.Result = viewResult; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; return; } #endregion #endregion } #endregion base.OnException(filterContext); }
public int Load(string u) { log.InfoFormat("Loading URL ({0})", u); int ans = S_OK; bufferSize = 0; url = u; bufferThreadExit = false; Monitor.Enter(this); bufferThread = new Thread(new ThreadStart(BufferProc)); bufferThread.Name = "DirectShow streaming thread (" + url + ")"; bufferThread.Start(); Monitor.Wait(this); if (redirect != null) { bufferThread = null; RedirectException e = new RedirectException(redirect); Monitor.Exit(this); throw e; } if (bufferSize == 0) { bufferThread = null; ans = S_FALSE; } else { GuessMediaType(url, out majorType, out minorType, out recommendedFilter); } Monitor.Exit(this); return ans; }