diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c
index d64ca64a15f4eeb1328b843965ca376f507e966e..2e89393815f0be4ce65c7da698943af6c0eca3b2 100644
--- a/src/core/lib/surface/call.c
+++ b/src/core/lib/surface/call.c
@@ -266,8 +266,18 @@ grpc_call *grpc_call_create(
                                            destroy_call, call, call->context,
                                            server_transport_data,
                                            CALL_STACK_FROM_CALL(call));
-// FIXME: handle error (probably requires changing this function's API)
-GPR_ASSERT(error == GRPC_ERROR_NONE);
+  if (error != GRPC_ERROR_NONE) {
+    intptr_t status;
+    if (!grpc_error_get_int(error, GRPC_ERROR_INT_GRPC_STATUS, &status))
+      status = GRPC_STATUS_UNKNOWN;
+    const char* error_string = grpc_error_string(error);
+    received_status* status_struct = &call->status[STATUS_FROM_CORE];
+    status_struct->is_set = true;
+    status_struct->code = status;
+    status_struct->details = grpc_mdstr_from_string(error_string);
+    grpc_error_free_string(error_string);
+    grpc_error_unref(error);
+  }
   if (cq != NULL) {
     GPR_ASSERT(
         pollset_set_alternative == NULL &&