메인 콘텐츠로 건너뛰기
Translation of pages other than English and Japanese versions is maintained by community contributions. The project does not guarantee the accuracy of the content and may not reflect the latest content.

예외 처리 및 상태 코드

최종 업데이트

MagicOnion은 서버의 처리 결과를 반환값과는 별도로 상태 코드로 반환하는 구조가 있습니다. 이는 HTTP의 상태 코드나 gRPC의 상태 코드와 유사합니다. 이 상태 코드에는 애플리케이션 고유의 상태 코드를 포함할 수도 있습니다.

서버에서 클라이언트로 상태 코드 알림

서버에서 클라이언트로 커스텀 상태 코드를 반환하는 경우에는 ReturnStatusException을 사용할 수 있습니다.

public Task SendMessageAsync(string message)
{
if (message.Contains("foo"))
{
//
throw new ReturnStatusException((Grpc.Core.StatusCode)MyStatusCode.SomethingWentWrong, "invalid");
}

// ....

ReturnStatusException은 상태 코드인 Grpc.Core.StatusCode 열거형을 가지며, 이 값을 클라이언트로 통지합니다. 애플리케이션의 커스텀 상태 코드를 반환하려면 독자적인 int 값 또는 열거형을 Grpc.Core.StatusCode 열거형으로 캐스팅하세요.

예외 발생을 피하여 성능을 중시하는 경우에는 CallContext.Status (ServiceContext.CallContext.Status)를 사용하여 상태를 직접 설정할 수 있습니다.

클라이언트에서 예외 처리

클라이언트에서는 메서드 호출 시의 예외가 모두 gRPC의 RpcException으로 수신됩니다.

var client = MagicOnionClient.Create<IGreeterService>(channel);
try
{
var result = await client.SayHelloAsync("Alice", 18);
}
catch (RpcException ex)
{
// handle exception ...
if (((MyStatusCode)ex.Status.StatusCode) == MyStatusCode.SomethingWentWrong)
{
// ...
}
}

네트워크에 문제가 있는 경우에는 RpcExceptionStatusCode.Unavailable로 발생됩니다. 자세한 에러 내용은 InnerException 속성으로 조사할 수 있습니다.

서버에서 처리되지 않은 예외

서버의 메서드 호출 중에 에러가 발생하여 ReturnStatusException을 제외한 처리되지 않은 예외가 발생된 경우, 클라이언트에서는 StatusCode.Unknown이 설정된 RpcException으로 처리됩니다.

이때 MagicOnionOption.IsReturnExceptionStackTraceInErrorDetailtrue인 경우, 클라이언트는 서버의 예외 스택 트레이스(Stack Trace)를 수신할 수 있습니다. 이는 디버깅에 매우 유용하지만, 심각한 보안 문제가 있으므로 디버그 빌드에서만 활성화해야 합니다.