ASP.NET Core의 오류 처리 소개Introduction to Error Handling in ASP.NET Core

Steve SmithTom DykstraBy Steve Smith and Tom Dykstra

이 문서에서는 일반적인 appoaches ASP.NET Core 응용 프로그램의 오류 처리를 다룹니다.This article covers common appoaches to handling errors in ASP.NET Core apps.

보거나 다운로드 샘플 코드 (다운로드 하는 방법을)View or download sample code (how to download)

개발자 예외 페이지The developer exception page

예외에 대 한 자세한 정보를 표시 하는 페이지를 표시 하는 응용 프로그램을 구성 하려면 설치는 Microsoft.AspNetCore.Diagnostics NuGet 패키지 하 고 행을 추가 하는 시작 클래스에서 메서드를 구성:To configure an app to display a page that shows detailed information about exceptions, install the Microsoft.AspNetCore.Diagnostics NuGet package and add a line to the Configure method in the Startup class:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();
    env.EnvironmentName = EnvironmentName.Production;
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/error");
    }

배치 UseDeveloperExceptionPage 와 같은 예외를 catch 하려는 모든 미들웨어 전에 app.UseMvc합니다.Put UseDeveloperExceptionPage before any middleware you want to catch exceptions in, such as app.UseMvc.

경고

개발자 예외 페이지를 사용 하도록 설정 응용 프로그램 개발 환경에서 실행 중인 경우에합니다.Enable the developer exception page only when the app is running in the Development environment. 프로덕션 환경에서 앱을 실행할 때 자세한 예외 정보를 공개적으로 공유 하는 것이 않으려는 합니다.You don't want to share detailed exception information publicly when the app runs in production. 환경 구성에 대 한 자세한합니다.Learn more about configuring environments.

개발자 예외 페이지를 보려면 샘플 응용 프로그램 설정 된 환경으로 실행 Development, 추가 ?throw=true 응용 프로그램의 기본 URL에 있습니다.To see the developer exception page, run the sample application with the environment set to Development, and add ?throw=true to the base URL of the app. 예외 및 요청에 대 한 정보로 여러 탭 페이지에 포함 됩니다.The page includes several tabs with information about the exception and the request. 첫 번째 탭에는 스택 추적에 포함 됩니다.The first tab includes a stack trace.

스택 추적

다음 탭 있는 경우는 쿼리 문자열 매개 변수를 나타냅니다.The next tab shows the query string parameters, if any.

쿼리 문자열 매개 변수

이 요청 된 쿠키를 포함 하지 않은 있지만에 표시 되는 경우는 쿠키 탭 합니다. 마지막으로 탭에 전달 된 헤더를 볼 수 있습니다.This request didn't have any cookies, but if it did, they would appear on the Cookies tab. You can see the headers that were passed in the last tab.

헤더

페이지를 처리 하는 사용자 지정 예외를 구성 합니다.Configuring a custom exception handling page

앱 실행 중이지 않을 때 사용 하는 예외 처리기 페이지를 구성 하는 것이 좋습니다는 Development 환경입니다.It's a good idea to configure an exception handler page to use when the app is not running in the Development environment.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();
    env.EnvironmentName = EnvironmentName.Production;
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/error");
    }

MVC 응용 프로그램의 안 함 명시적으로 데코 레이트 HTTP 메서드 특성을 사용 하 여 오류 처리기 작업 메서드 같은 HttpGet합니다.In an MVC app, don't explicitly decorate the error handler action method with HTTP method attributes, such as HttpGet. 명시적 동사를 사용 하 여 메서드에서 일부 요청 하지 못하도록 수 없습니다.Using explicit verbs could prevent some requests from reaching the method.

[Route("/Error")]
public IActionResult Index()
{
    // Handle error here
}

상태 코드 페이지를 구성합니다.Configuring status code pages

기본적으로 응용 프로그램에 대 한 HTTP 상태 코드 500 (내부 서버 오류) 또는 404 (찾을 수 없음)와 같은 다양 한 상태 코드 페이지를 제공 하지 않습니다.By default, your app will not provide a rich status code page for HTTP status codes such as 500 (Internal Server Error) or 404 (Not Found). 구성할 수는 StatusCodePagesMiddleware 줄을 추가 하 여는 Configure 메서드:You can configure the StatusCodePagesMiddleware by adding a line to the Configure method:

app.UseStatusCodePages();

기본적으로이 미들웨어 404 등의 일반적인 상태 코드에 대 한 간단 하 고 텍스트 전용 처리기를 추가합니다.By default, this middleware adds simple, text-only handlers for common status codes, such as 404:

404 페이지

미들웨어는 일부의 확장 메서드를 지원합니다.The middleware supports several different extension methods. 람다 식에서 바라볼, 다른 콘텐츠 형식 및 형식 문자열을 사용 합니다.One takes a lambda expression, another takes a content type and format string.

app.UseStatusCodePages(async context =>
{
    context.HttpContext.Response.ContentType = "text/plain";
    await context.HttpContext.Response.WriteAsync(
        "Status code page, status code: " + 
        context.HttpContext.Response.StatusCode);
});
app.UseStatusCodePages("text/plain", "Status code page, status code: {0}");

리디렉션 확장 메서드가 있습니다.There are also redirect extension methods. 하나 302 상태 코드를 클라이언트에 보내고 하나 클라이언트에는 원래 상태 코드를 반환 하지만 또한 리디렉션 URL에 대 한 처리기를 실행 합니다.One sends a 302 status code to the client, and one returns the original status code to the client but also executes the handler for the redirect URL.

app.UseStatusCodePagesWithRedirects("/error/{0}");
app.UseStatusCodePagesWithReExecute("/error/{0}");

특정 요청에 대 한 상태 코드 페이지를 사용 하지 않도록 설정 해야 할 경우이 수행할 수 있습니다.If you need to disable status code pages for certain requests, you can do so:

var statusCodePagesFeature = context.Features.Get<IStatusCodePagesFeature>();
if (statusCodePagesFeature != null)
{
  statusCodePagesFeature.Enabled = false;
}

예외 처리 코드Exception-handling code

예외 처리 페이지의에서 코드는 예외가 발생할 수 있습니다.Code in exception handling pages can throw exceptions. 종종 완전 한 정적 콘텐츠의 구성 프로덕션 오류 페이지에 대 한는 것이 좋습니다.It's often a good idea for production error pages to consist of purely static content.

또한 유의 하십시오를 응답에 대 한 헤더를 보낸 응답의 상태 코드를 변경할 수 없습니다 및 예외 페이지 또는 처리기 실행할 수 있습니다.Also, be aware that once the headers for a response have been sent, you can't change the response's status code, nor can any exception pages or handlers run. 응답을 완료 해야 하거나 연결이 중단 합니다.The response must be completed or the connection aborted.

서버 예외 처리Server exception handling

응용 프로그램에서 논리를 처리 하는 예외 뿐 아니라는 서버 응용 프로그램 호스팅 몇 가지 예외 처리를 수행 합니다.In addition to the exception handling logic in your app, the server hosting your app performs some exception handling. 헤더를 보내기 전에 된 예외를 catch 하는 서버를 하는 경우 서버 본문이 없는 500 내부 서버 오류 응답을 보냅니다.If the server catches an exception before the headers are sent, the server sends a 500 Internal Server Error response with no body. 헤더를 보낸 후에 예외를 catch 하는 서버를 서버 연결을 닫습니다.If the server catches an exception after the headers have been sent, the server closes the connection. 응용 프로그램으로 처리 되지 요청은 서버에서 처리 됩니다.Requests that aren't handled by your app are handled by the server. 서버의 예외 발생 하는 모든 예외를 처리를 처리 합니다.Any exception that occurs is handled by the server's exception handling. 구성 된 모든 사용자 지정 오류 페이지 또는 예외 처리 미들웨어 또는 필터 안 함이 동작에 영향을이 있습니다.Any configured custom error pages or exception handling middleware or filters don't affect this behavior.

시작 예외 처리Startup exception handling

호스팅 계층에만 응용 프로그램 시작 시 수행 되는 예외를 처리할 수 있습니다.Only the hosting layer can handle exceptions that take place during app startup. 할 수 있습니다 호스트 오류에 대 한 응답으로 시작 하는 동안 작동 하는 방법을 구성할 를 사용 하 여 captureStartupErrorsdetailedErrors 키입니다.You can configure how the host behaves in response to errors during startup using captureStartupErrors and the detailedErrors key.

호스트 주소/포트 바인딩 후에 오류가 발생 하는 경우 호스팅 캡처된 시작 오류에 대 한 오류 페이지만 표시할 수 있습니다.Hosting can only show an error page for a captured startup error if the error occurs after host address/port binding. 어떤 이유로 든 실패 하면 모든 바인딩에 호스팅 계층 dotnet 프로세스가 충돌할 중요 한 예외를 기록 하 고 없음 오류 페이지가 표시 됩니다.If any binding fails for any reason, the hosting layer logs a critical exception, the dotnet process crashes, and no error page is displayed.

ASP.NET MVC 오류 처리ASP.NET MVC error handling

MVC 앱은 예외 필터를 구성 하 고 모델 유효성 검사를 수행 하는 등의 오류를 처리 하기 위한 몇 가지 추가 옵션이 있습니다.MVC apps have some additional options for handling errors, such as configuring exception filters and performing model validation.

예외 필터Exception Filters

전역으로 또는 MVC 응용 프로그램에서-컨트롤러 또는 동작 당 기준 예외 필터를 구성할 수 있습니다.Exception filters can be configured globally or on a per-controller or per-action basis in an MVC app. 이러한 필터 컨트롤러 작업 또는 다른 필터를 실행 하는 동안 발생 하는 처리 되지 않은 예외를 처리 하며 그렇지 않으면 호출 되지 않습니다.These filters handle any unhandled exception that occurs during the execution of a controller action or another filter, and are not called otherwise. 예외 필터에 대 한 자세한 필터합니다.Learn more about exception filters in Filters.

예외 필터는 MVC 동작 내에서 발생 하는 예외를 트래핑 하는 데 유용 하지만 유연 하 게 오류 미들웨어를 처리 하지 않습니다.Exception filters are good for trapping exceptions that occur within MVC actions, but they're not as flexible as error handling middleware. 일반적인 경우에 대 한 미들웨어를 선호 하 고만 해야 하는 필터를 사용 하 여 오류 처리 작업을 수행할 다르게 MVC 작업 선택에 따라 합니다.Prefer middleware for the general case, and use filters only where you need to do error handling differently based on which MVC action was chosen.

처리 모델 상태 오류Handling Model State Errors

유효성 검사 모델 호출 되는 각 컨트롤러 동작 하기 전에 발생 하 고 검사 해야 하는 작업 메서드의 ModelState.IsValid 하 고 적절 하 게 대처 합니다.Model validation occurs prior to each controller action being invoked, and it is the action method’s responsibility to inspect ModelState.IsValid and react appropriately.

일부 응용 프로그램 모델 유효성 검사 오류를 처리 하기 위한 표준 규칙에는 쿼리에서 수행 하도록 선택 하는 필터 이러한 정책을 구현 하는 적절 한 위치 수 있습니다.Some apps will choose to follow a standard convention for dealing with model validation errors, in which case a filter may be an appropriate place to implement such a policy. 잘못 된 모델 상태와 작업을 수행할 때 동작 하는 방법을 테스트 해야 합니다.You should test how your actions behave with invalid model states. 자세한 내용을 알아보세요 컨트롤러 논리를 테스트합니다.Learn more in Testing controller logic.