diff --git a/Documentation/guides/application-developer.rst b/Documentation/guides/application-developer.rst
index e3430f03..e8a1a7b4 100644
--- a/Documentation/guides/application-developer.rst
+++ b/Documentation/guides/application-developer.rst
@@ -392,6 +392,8 @@ the `Request::Status`_ class enum documentation.
 
    if (request->status() == Request::RequestCancelled)
       return;
+   if (request->status() == Request::RequestError)
+      // handle error.
 
 If the ``Request`` has completed successfully, applications can access the
 completed buffers using the ``Request::buffers()`` function, which returns a map
diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp
index 7b55fc67..3e9edf80 100644
--- a/src/cam/capture.cpp
+++ b/src/cam/capture.cpp
@@ -167,6 +167,11 @@ void Capture::requestComplete(Request *request)
 {
 	if (request->status() == Request::RequestCancelled)
 		return;
+	/* TODO: Handle an error correctly */
+	if (request->status() == Request::RequestError) {
+		std::cout << "Failed to capture request: " << request->cookie();
+		return;
+	}
 
 	/*
 	 * Defer processing of the completed request to the event loop, to avoid
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index 87246b40..1ecb9883 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -163,10 +163,14 @@ GstLibcameraSrcState::requestCompleted(Request *request)
 
 	g_return_if_fail(wrap->request_.get() == request);
 
-	if ((request->status() == Request::RequestCancelled)) {
+	if (request->status() == Request::RequestCancelled) {
 		GST_DEBUG_OBJECT(src_, "Request was cancelled");
 		return;
 	}
+	if (request->status() == Request::RequestError) {
+		GST_ERROR_OBJECT(src_, "Request doesn't complete successfully");
+		return;
+	}
 
 	GstBuffer *buffer;
 	for (GstPad *srcpad : srcpads_) {
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 39d034de..1288bcd5 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -694,6 +694,10 @@ void MainWindow::requestComplete(Request *request)
 {
 	if (request->status() == Request::RequestCancelled)
 		return;
+	if (request->status() == Request::RequestError) {
+		qCritical() << "Request doesn't complete successfully";
+		return;
+	}
 
 	/*
 	 * We're running in the libcamera thread context, expensive operations
diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp
index 97825c71..d6b1d755 100644
--- a/src/v4l2/v4l2_camera.cpp
+++ b/src/v4l2/v4l2_camera.cpp
@@ -84,6 +84,11 @@ void V4L2Camera::requestComplete(Request *request)
 {
 	if (request->status() == Request::RequestCancelled)
 		return;
+	if (request->status() == Request::RequestError) {
+		LOG(V4L2Compat, Error)
+			<< "Request doesn't complete successfully";
+		return;
+	}
 
 	/* We only have one stream at the moment. */
 	bufferLock_.lock();
