/* * Copyright 2015 The gRPC Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.grpc; import javax.annotation.Nullable; /** * {@link Status} in RuntimeException form, for propagating Status information via exceptions. * * @see StatusException */ public class StatusRuntimeException extends RuntimeException { private static final long serialVersionUID = 1950934672280720624L; private final Status status; private final Metadata trailers; private final boolean fillInStackTrace; /** * Constructs the exception with both a status. See also {@link Status#asRuntimeException()}. * * @since 1.0.0 */ public StatusRuntimeException(Status status) { this(status, null); } /** * Constructs the exception with both a status and trailers. See also {@link * Status#asRuntimeException(Metadata)}. * * @since 1.0.0 */ public StatusRuntimeException(Status status, @Nullable Metadata trailers) { this(status, trailers, /*fillInStackTrace=*/ true); } StatusRuntimeException(Status status, @Nullable Metadata trailers, boolean fillInStackTrace) { super(Status.formatThrowableMessage(status), status.getCause()); this.status = status; this.trailers = trailers; this.fillInStackTrace = fillInStackTrace; fillInStackTrace(); } @Override public synchronized Throwable fillInStackTrace() { // Let's observe final variables in two states! This works because Throwable will invoke this // method before fillInStackTrace is set, thus doing nothing. After the constructor has set // fillInStackTrace, this method will properly fill it in. Additionally, sub classes may call // this normally, because fillInStackTrace will either be set, or this method will be // overriden. return fillInStackTrace ? super.fillInStackTrace() : this; } /** * Returns the status code as a {@link Status} object. * * @since 1.0.0 */ public final Status getStatus() { return status; } /** * Returns the received trailers. * * @since 1.0.0 */ @Nullable public final Metadata getTrailers() { return trailers; } }