예외 처리 및 상태 코드
최종 업데이트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)
    {
        // ...
    }
}
네트워크에 문제가 있는 경우에는 RpcException이 StatusCode.Unavailable로 발생됩니다. 자세한 에러 내용은 InnerException 속성으로 조사할 수 있습니다.
서버에서 처리되지 않은 예외
서버의 메서드 호출 중에 에러가 발생하여 ReturnStatusException을 제외한 처리되지 않은 예외가 발생된 경우, 클라이언트에서는 StatusCode.Unknown이 설정된 RpcException으로 처리됩니다.
이때 MagicOnionOption.IsReturnExceptionStackTraceInErrorDetail이 true인 경우, 클라이언트는 서버의 예외 스택 트레이스(Stack Trace)를 수신할 수 있습니다. 이는 디버깅에 매우 유용하지만, 심각한 보안 문제가 있으므로 디버그 빌드에서만 활성화해야 합니다.