diff --git a/changelog.d/4361.misc b/changelog.d/4361.misc
new file mode 100644
index 0000000000000000000000000000000000000000..020dacb5476920be23118e21397469f6b7f4760a
--- /dev/null
+++ b/changelog.d/4361.misc
@@ -0,0 +1 @@
+Add better logging for unexpected errors while sending transactions
diff --git a/changelog.d/4362.misc b/changelog.d/4362.misc
new file mode 100644
index 0000000000000000000000000000000000000000..020dacb5476920be23118e21397469f6b7f4760a
--- /dev/null
+++ b/changelog.d/4362.misc
@@ -0,0 +1 @@
+Add better logging for unexpected errors while sending transactions
diff --git a/synapse/federation/transaction_queue.py b/synapse/federation/transaction_queue.py
index 46405134977f61c88c6b21fe442480007484483d..fe787abaebf310ba40e1ae3cf3dd44d5ce342892 100644
--- a/synapse/federation/transaction_queue.py
+++ b/synapse/federation/transaction_queue.py
@@ -522,8 +522,13 @@ class TransactionQueue(object):
             )
         except FederationDeniedError as e:
             logger.info(e)
+        except HttpResponseException as e:
+            logger.warning(
+                "TX [%s] Received %d response to transaction: %s",
+                destination, e.code, e,
+            )
         except RequestSendFailed as e:
-            logger.warning("(TX [%s] Failed to send transaction: %s", destination, e)
+            logger.warning("TX [%s] Failed to send transaction: %s", destination, e)
 
             for p, _ in pending_pdus:
                 logger.info("Failed to send event %s to %s", p.event_id,
diff --git a/synapse/http/matrixfederationclient.py b/synapse/http/matrixfederationclient.py
index 7a2b4f0957d0921ae97434fe35be5eda16b55ff9..be4076fc6aee8723eeae217872904f642d881268 100644
--- a/synapse/http/matrixfederationclient.py
+++ b/synapse/http/matrixfederationclient.py
@@ -823,21 +823,21 @@ def check_content_type_is_json(headers):
         headers (twisted.web.http_headers.Headers): headers to check
 
     Raises:
-        RuntimeError if the
+        RequestSendFailed: if the Content-Type header is missing or isn't JSON
 
     """
     c_type = headers.getRawHeaders(b"Content-Type")
     if c_type is None:
-        raise RuntimeError(
+        raise RequestSendFailed(RuntimeError(
             "No Content-Type header"
-        )
+        ), can_retry=False)
 
     c_type = c_type[0].decode('ascii')  # only the first header
     val, options = cgi.parse_header(c_type)
     if val != "application/json":
-        raise RuntimeError(
+        raise RequestSendFailed(RuntimeError(
             "Content-Type not application/json: was '%s'" % c_type
-        )
+        ), can_retry=False)
 
 
 def encode_query_args(args):