Statuscodes und Fehlerbehandlung
Lernen Sie, gRPC-Statuscodes effektiv zu verwenden und eine korrekte Fehlerweitergabe und -behandlung in Ihren Services zu implementieren.
Statuscodes und Fehlerbehandlung ist eine kostenlose gRPC & High Performance APIs-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des gRPC & High Performance APIs-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der gRPC & High Performance APIs-Kurs umfasst insgesamt 4 Lektionen.
Teile dieser Lektion wurden noch nicht übersetzt und werden auf Englisch angezeigt.
Why Handle gRPC Errors?
In any robust application, errors are inevitable. How we handle them can make or break a system's reliability and user experience.
For distributed systems using gRPC, consistent error handling is crucial. It ensures that services can communicate problems clearly and clients can react appropriately.
Meet gRPC Status Codes
gRPC uses a standardized set of Status Codes to indicate the outcome of an RPC (Remote Procedure Call). These codes provide a universal way to understand why a call succeeded or failed.
Think of them like HTTP status codes, but specifically for gRPC. Some common ones include:
OK: The RPC completed successfully.NOT_FOUND: Resource not found (e.g., a user ID doesn't exist).INTERNAL: An unexpected error occurred on the server.UNAUTHENTICATED: The request lacks valid authentication credentials.
Protobuf Service Definition
Before we look at error handling, let's define a simple service in a .proto file. This defines the structure of our messages and the RPC methods.
We'll create a UserService with a GetUser method that takes a UserRequest and returns a User.
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.coddykit.grpc.error";
option java_outer_classname = "ErrorProto";
package errorhandling;
message UserRequest {
int32 id = 1;
}
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
service UserService {
rpc GetUser (UserRequest) returns (User);
}Server-Side Error Signaling
On the server, when an operation fails, you don't throw a regular exception. Instead, you create a gRPC Status object with an appropriate code and description, then convert it to a StatusRuntimeException.
This exception is then sent back to the client via the responseObserver.onError() method, ensuring the client receives the standardized gRPC error.
Server Error Implementation
Try running this example. The server will respond with a NOT_FOUND error if you request any user ID other than 1.
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.Status;
import io.grpc.stub.StreamObserver;
import com.coddykit.grpc.error.ErrorProto.User;
import com.coddykit.grpc.error.ErrorProto.UserRequest;
import com.coddykit.grpc.error.UserServiceGrpc;
public class ErrorServer {
private static final int PORT = 50051;
public static void main(String[] args) throws Exception {
Server server = ServerBuilder.forPort(PORT)
.addService(new UserServiceImpl())
.build();
server.start();
System.out.println("Server started on port " + PORT);
server.awaitTermination();
}
static class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {
@Override
public void getUser(UserRequest request, StreamObserver<User> responseObserver) {
System.out.println("Received GetUser request for ID: " + request.getId());
if (request.getId() == 1) {
User user = User.newBuilder()
.setId(1)
.setName("Alice")
.setEmail("alice@example.com")
.build();
responseObserver.onNext(user);
responseObserver.onCompleted();
} else {
Status status = Status.NOT_FOUND.withDescription("User with ID " + request.getId() + " not found.");
responseObserver.onError(status.asRuntimeException());
}
}
}
}Client-Side Error Handling
On the client side, gRPC errors are typically received as StatusRuntimeException. You should wrap your gRPC calls in try-catch blocks to gracefully handle these exceptions.
Inside the catch block, you can inspect the Status object from the exception to determine the error code and description, allowing your client to respond intelligently.
Client Error Handling Demo
Run this client code after starting the server from the previous scene. Observe how it handles both a successful user lookup and a 'not found' error.
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.StatusRuntimeException;
import com.coddykit.grpc.error.ErrorProto.User;
import com.coddykit.grpc.error.ErrorProto.UserRequest;
import com.coddykit.grpc.error.UserServiceGrpc;
public class ErrorClient {
private static final int PORT = 50051;
private static final String HOST = "localhost";
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress(HOST, PORT)
.usePlaintext() // For local testing without TLS
.build();
UserServiceGrpc.UserServiceBlockingStub blockingStub = UserServiceGrpc.newBlockingStub(channel);
// Scenario 1: User found
try {
UserRequest foundRequest = UserRequest.newBuilder().setId(1).build();
User user = blockingStub.getUser(foundRequest);
System.out.println("User found: " + user.getName());
} catch (StatusRuntimeException e) {
System.err.println("Error calling GetUser (found scenario): " + e.getStatus().getCode() + " - " + e.getStatus().getDescription());
}
System.out.println("\n--- Trying to get a non-existent user ---");
// Scenario 2: User not found (expected error)
try {
UserRequest notFoundRequest = UserRequest.newBuilder().setId(99).build();
User user = blockingStub.getUser(notFoundRequest);
System.out.println("User found (unexpected): " + user.getName()); // This line should not be reached
} catch (StatusRuntimeException e) {
System.err.println("Error calling GetUser (not found scenario):");
System.err.println(" Status Code: " + e.getStatus().getCode());
System.err.println(" Description: " + e.getStatus().getDescription());
} finally {
channel.shutdown();
}
}
}Effective Error Propagation
Proper error propagation is vital. When a gRPC service calls another internal service and encounters an error, it's often best to:
- Log the error with sufficient detail for debugging.
- Translate the error into an appropriate gRPC
Statuscode for the calling client. Don't expose internal system errors directly. - Avoid swallowing errors. Always handle them or re-throw them so they don't disappear silently.
Test Your Knowledge
You are building a gRPC service that performs a complex calculation. If the input data is invalid (e.g., negative numbers where only positive are allowed), which gRPC Status code is most appropriate to return?
Key Takeaways
You've learned the basics of gRPC error handling!
- gRPC uses standardized Status Codes to communicate RPC outcomes.
- Servers signal errors by creating a
Statusobject and callingresponseObserver.onError(). - Clients handle errors by catching
StatusRuntimeExceptionand inspecting itsStatusobject. - Always propagate errors clearly and translate them appropriately for clients.
This structured approach ensures reliable communication in your distributed systems.
Häufig gestellte Fragen
Ist die Lektion „Statuscodes und Fehlerbehandlung“ kostenlos?
Ja — der vollständige Text von „Statuscodes und Fehlerbehandlung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des gRPC & High Performance APIs-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der gRPC & High Performance APIs-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Statuscodes und Fehlerbehandlung“?
Lernen Sie, gRPC-Statuscodes effektiv zu verwenden und eine korrekte Fehlerweitergabe und -behandlung in Ihren Services zu implementieren. Du übst gRPC & High Performance APIs mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um gRPC & High Performance APIs zu starten?
Keine Vorkenntnisse erforderlich. gRPC & High Performance APIs auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Statuscodes und Fehlerbehandlung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser gRPC & High Performance APIs-Lektion Code schreiben und ausführen?
Ja. Jede gRPC & High Performance APIs-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Statuscodes und Fehlerbehandlung
- Übertragung benutzerdefinierter Metadaten
- Kontext und Zeitlimits
- Ausdrucksstarke Fehlermodelle mit google.rpc.Status