diff --git a/call.go b/call.go
index 49406637..93262360 100644
--- a/call.go
+++ b/call.go
@@ -158,9 +158,6 @@ func Invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli
 			if _, ok := err.(rpcError); ok {
 				return err
 			}
-			if err == ErrClientConnClosing {
-				return Errorf(codes.FailedPrecondition, "%v", err)
-			}
 			if err == errConnClosing {
 				if c.failFast {
 					return Errorf(codes.Unavailable, "%v", errConnClosing)
diff --git a/clientconn.go b/clientconn.go
index 2ef9fa4c..4e80ad73 100644
--- a/clientconn.go
+++ b/clientconn.go
@@ -431,7 +431,7 @@ func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions)
 	cc.mu.RLock()
 	if cc.conns == nil {
 		cc.mu.RUnlock()
-		return nil, nil, ErrClientConnClosing
+		return nil, nil, toRPCErr(ErrClientConnClosing)
 	}
 	ac, ok := cc.conns[addr]
 	cc.mu.RUnlock()
diff --git a/rpc_util.go b/rpc_util.go
index 23d60e6c..91342bd8 100644
--- a/rpc_util.go
+++ b/rpc_util.go
@@ -401,7 +401,13 @@ func toRPCErr(err error) error {
 				code: codes.Canceled,
 				desc: err.Error(),
 			}
+		case ErrClientConnClosing:
+			return rpcError{
+				code: codes.FailedPrecondition,
+				desc: err.Error(),
+			}
 		}
+
 	}
 	return Errorf(codes.Unknown, "%v", err)
 }
diff --git a/stream.go b/stream.go
index 60319022..73d1da23 100644
--- a/stream.go
+++ b/stream.go
@@ -152,9 +152,6 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
 			if _, ok := err.(rpcError); ok {
 				return nil, err
 			}
-			if err == ErrClientConnClosing {
-				return nil, Errorf(codes.FailedPrecondition, "%v", err)
-			}
 			if err == errConnClosing {
 				if c.failFast {
 					return nil, Errorf(codes.Unavailable, "%v", errConnClosing)