.NET 핵심 전투 개발 (제 22과 : 예외 처리 미들웨어 : 논리는 이상 진정한 이상과 구별하기 위해) - 연구 노트 (A)를

이상 사실 이상을 구별하는 논리 : 예외가 미들웨어 처리 | 22이다

이 섹션에서 우리는 모범 사례를 처리 오류에 대해 설명

예외 처리 시스템 내부 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의 링크 단절, 레디 스 연결에 이상이 발생한 발생

다음과 같은 우리의 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>

프로그램을 시작 후에는 사용자 지정 오류 페이지가 성공적으로 렌더링되어 볼 수있는

이 첫 번째 치료 잘못된 방법입니다

크리에이티브 커먼즈 라이센스

이 작품은 비영리 - - 동일 조건 변경 허락 4.0 국제 라이센스 계약 크리에이티브 커먼즈 저작자 표시 라이선스합니다.

무단 전재, 사용, 재 게시에 오신 것을 환영합니다,하지만 (링크가 포함 : http://www.cnblogs.com/MingsonZheng/)를 청 Ziming에 의해 서명 된 문서를 유지하기 위해 반드시 상업적인 목적으로 사용할 수 없다, 용지 사용권 변경에 따라 같은 일을 게시해야 .

당신은 질문이있는 경우에는, 저에게 연락 주시기 바랍니다 ([email protected]).

추천

출처www.cnblogs.com/MingsonZheng/p/12466561.html