боевая разработка .NET ядра (Урок 22: Исключение обработки промежуточный слой: логика, чтобы отличить истинную аномалию и аномалии) - Study Notes (а)

22 | Исключение обработки промежуточного слоя: логика, чтобы отличить истинную аномалию и аномалии

В этом разделе мы объясняем Обработка ошибок Best Practices

Внутри системы обработки исключений, ASP.NET Ядро предоставляет четыре способа

1, обработка исключений страницы

2, обработка исключений метод анонимного делегата

3, IExceptionFilter

4, ExceptionFilterAttribute

Источник ссылка:
https://github.com/witskeeper/geektime/tree/master/samples/ExceptionDemo

Ввод в эксплуатацию метода Настройка

if (env.IsDevelopment())
{
    // 开发环境下的异常处理页
    app.UseDeveloperExceptionPage();
}

Контроллер бросать исключения

throw new Exception("报个错");

Запустите программу, вы увидите страницу ошибки

Эта страница ошибок печатает Дополнительная информация Для получения дополнительной информации и ошибок наш текущий запрос, эта страница не подходит для пользователя, чтобы увидеть, так что эта страница ошибки в производственной среде должен быть закрыт

Вот как обычные страницы ошибок обработки:

// 第一种方式就是定义错误页的方式
app.UseExceptionHandler("/error");

Определить интерфейс IKnownException

namespace ExceptionDemo.Exceptions
{
    public interface IKnownException
    {
        public string Message { get; }

        public int ErrorCode { get; }

        public object[] ErrorData { get; }
    }
}

KnownException реализация по умолчанию

namespace ExceptionDemo.Exceptions
{
    public class KnownException : IKnownException
    {
        public string Message { get; private set; }

        public int ErrorCode { get; private set; }

        public object[] ErrorData { get; private set; }

        public readonly static IKnownException Unknown = new KnownException { Message = "未知错误", ErrorCode = 9999 };

        public static IKnownException FromKnownException(IKnownException exception)
        {
            return new KnownException { Message = exception.Message, ErrorCode = exception.ErrorCode, ErrorData = exception.ErrorData };
        }
    }
}

Почему нам нужно определить такой тип это?

Поскольку исключения разные систем внутри нашего обычно ненормальные и наш бизнес-логика, бизнес-логика выше исключения суждения, такие как входные параметры, статус заказа не соответствуют условиям, сальдо текущего счета является недостаточным, у нас есть информация, как это два подхода:

Процессинговый способ отличается от различных бизнес-объекта логического вывода

Другим способ для ненормальности такого бизнеса-логики, выход исключения, специального исключения для выполнения расходящихся логиков, на этот раз потребность идентифицирована, которые ненормальное движение, которое неизвестна ненормальная неопределенная, например, сеть запрос происходит исключение, MySql ссылки разъединение, Redis соединение неисправно

Затем, чтобы нести сообщение об ошибке, определив страницу ошибки, такие, как наш ErrorController, это только одна страница, его роль для вывода сообщения об ошибке

namespace ExceptionDemo.Controllers
{
    [AllowAnonymous]
    public class ErrorController : Controller
    {
        [Route("/error")]
        public IActionResult Index()
        {
            // 获取当前上下文里面报出的异常信息
            var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

            var ex = exceptionHandlerPathFeature?.Error;

            // 特殊处理,尝试转换为 IKnownException
            var knownException = ex as IKnownException;
            // 对于未知异常,我们并不应该把错误异常完整地输出给客户端,而是应该定义一个特殊的信息 Unknown 传递给用户
            // Unknown 其实也是一个 IKnownException 的实现,它的 Message = "未知错误", ErrorCode = 9999
            // 也就是说我们在控制器 throw new Exception("报个错"); 就会看到错误信息
            if (knownException == null)
            {
                var logger = HttpContext.RequestServices.GetService<ILogger<MyExceptionFilterAttribute>>();
                // 我们看到的信息是未知错误,但是在我们的日志系统里面,我们还是记录的原有的异常信息
                logger.LogError(ex, ex.Message);
                knownException = KnownException.Unknown;
            }
            else// 当识别到异常是已知的业务异常时,输出已知的异常,包括异常消息,错误状态码和错误信息,就是在 IKnownException 中的定义
            {
                knownException = KnownException.FromKnownException(knownException);
            }
            return View(knownException);
        }
    }
}

Посмотреть

@model ExceptionDemo.Exceptions.IKnownException
@{
    ViewData["Title"] = "Index";
}

<h1>错误信息</h1>

<div>Message:<label>@Model.Message</label></div>
<div>ErrorCode<label>@Model.ErrorCode</label></div>

После запуска программы вы можете увидеть пользовательскую страницу ошибка была успешно оказаны

Это первое лечение неправильно

Creative Commons License

Эта работа Creative Commons Attribution - Некоммерческая - ShareAlike 4.0 Международное Лицензионное соглашение по лицензированию.

Добро пожаловать на переиздание, использование, перепечатывать, но не забудьте сохранить статью за подписью Чжэн Цзымином (содержащие ссылки: http://www.cnblogs.com/MingsonZheng/), не должен использоваться в коммерческих целях, не забудьте опубликовать ту же работу на основе модификации лицензионной бумаги ,

Если у вас есть какие-либо вопросы, пожалуйста, свяжитесь со мной ([email protected]).

рекомендация

отwww.cnblogs.com/MingsonZheng/p/12466561.html