diff --git a/client/object_search.go b/client/object_search.go
index aa02542..42018e5 100644
--- a/client/object_search.go
+++ b/client/object_search.go
@@ -220,7 +220,7 @@ func (x *ObjectListReader) Close() (*ResObjectSearch, error) {
 	defer x.cancelCtxStream()
 
 	if x.err != nil && !errors.Is(x.err, io.EOF) {
-		return nil, x.err
+		return &x.res, x.err
 	}
 
 	return &x.res, nil
diff --git a/pool/pool.go b/pool/pool.go
index 4e76978..d795af8 100644
--- a/pool/pool.go
+++ b/pool/pool.go
@@ -1092,7 +1092,7 @@ func (c *clientWrapper) objectSearch(ctx context.Context, prm PrmObjectSearch) (
 		return ResObjectSearch{}, fmt.Errorf("init object searching on client: %w", err)
 	}
 
-	return ResObjectSearch{r: res}, nil
+	return ResObjectSearch{r: res, handleError: c.handleError}, nil
 }
 
 // sessionCreate invokes sdkClient.SessionCreate parse response status to error and return result as is.
@@ -1278,7 +1278,7 @@ func needCountError(ctx context.Context, err error) bool {
 		return false
 	}
 
-	if errors.Is(ctx.Err(), context.Canceled) {
+	if ctx != nil && errors.Is(ctx.Err(), context.Canceled) {
 		return false
 	}
 
@@ -2764,18 +2764,25 @@ func (p *Pool) ObjectRange(ctx context.Context, prm PrmObjectRange) (ResObjectRa
 //
 // Must be initialized using Pool.SearchObjects, any other usage is unsafe.
 type ResObjectSearch struct {
-	r *sdkClient.ObjectListReader
+	r           *sdkClient.ObjectListReader
+	handleError func(context.Context, apistatus.Status, error) error
 }
 
 // Read reads another list of the object identifiers.
 func (x *ResObjectSearch) Read(buf []oid.ID) (int, error) {
 	n, ok := x.r.Read(buf)
 	if !ok {
-		_, err := x.r.Close()
+		res, err := x.r.Close()
 		if err == nil {
 			return n, io.EOF
 		}
 
+		var status apistatus.Status
+		if res != nil {
+			status = res.Status()
+		}
+		err = x.handleError(nil, status, err)
+
 		return n, err
 	}