                 // The Attribute Protocol Read By Type Request is used to perform the sub-procedure.
                 // The Attribute Type is set to the known characteristic UUID and the Starting Handle and Ending Handle parameters
                 // shall be set to the range over which this read is to be performed. This is typically the handle range for the service in which the characteristic belongs.
-                let request = ATTReadByTypeRequest(
-                    startHandle: handleRange.start,
-                    endHandle: handleRange.end,
-                    attributeType: uuid
-                )
-                let operation = ReadUsingUUIDOperation(uuid: uuid) { result in
-                    continuation.resume(with: result)
+                do {
+                    let request = ATTReadByTypeRequest(
+                        startHandle: handleRange.start,
+                        endHandle: handleRange.end,
+                        attributeType: uuid
+                    )
+                    let operation = ReadUsingUUIDOperation(uuid: uuid) { result in
+                        continuation.resume(with: result)
+                    }
+                    let response = try await send(request, response: ATTReadByTypeResponse.self)
+                    readByTypeResponse(response, operation: operation)
+                } catch {
+                    assert(error as? ATTErrorResponse == nil)
+                    continuation.resume(throwing: error)
                 }
-                let response = try await send(request, response: ATTReadByTypeResponse.self)
-                readByTypeResponse(response, operation: operation)
             }
         }
     }

        
        @inline(__always)
        func success() {
            
            completion(.success(foundDescriptors))
        }
        
        @inline(__always)
        func failure(_ responseError: ATTErrorResponse) {
            
            if responseError.error == .attributeNotFound {
                
                success()
                
            } else {
                
                completion(.failure(GATTClientError.errorResponse(responseError)))
            }
        }
    }

     
     ![Image](https://github.com/PureSwift/Bluetooth/raw/master/Assets/DiscoverAllCharacteristicDescriptors.png)
     */
    public func discoverDescriptors(
        for characteristic: Characteristic,
        service: (declaration: Service, characteristics: [Characteristic])
    ) async throws -> [Descriptor] {
        
        /**
         The Attribute Protocol Find Information Request shall be used with the Starting Handle set
         to the handle of the specified characteristic value + 1 and the Ending Handle set to the
         ending handle of the specified characteristic.
         */
        let start = characteristic.handle.value + 1
        let end = endHandle(for: characteristic, service: service)
        let operation = DescriptorDiscoveryOperation(start: start, end: end, completion: completion)
        try await discoverDescriptors(operation: operation)
    }
    
    /// Read Characteristic Descriptor
