diff --git a/duniterpy/api/client.py b/duniterpy/api/client.py
index 9818f8466f8cabb87e5c217b3d5ab8beedf6273e..d41c2f0de0e8bf1f03774c5754406a968161d9ba 100644
--- a/duniterpy/api/client.py
+++ b/duniterpy/api/client.py
@@ -41,8 +41,8 @@ def parse_text(text: str, schema: dict) -> Any:
     try:
         data = json.loads(text)
         jsonschema.validate(data, schema)
-    except (TypeError, json.decoder.JSONDecodeError):
-        raise jsonschema.ValidationError("Could not parse json")
+    except (TypeError, json.decoder.JSONDecodeError) as e:
+        raise jsonschema.ValidationError("Could not parse json") from e
 
     return data
 
@@ -58,7 +58,9 @@ def parse_error(text: str) -> Any:
         data = json.loads(text)
         jsonschema.validate(data, ERROR_SCHEMA)
     except (TypeError, json.decoder.JSONDecodeError) as e:
-        raise jsonschema.ValidationError("Could not parse json : {0}".format(str(e)))
+        raise jsonschema.ValidationError(
+            "Could not parse json : {0}".format(str(e))
+        ) from e
 
     return data
 
@@ -78,7 +80,9 @@ async def parse_response(response: ClientResponse, schema: dict) -> Any:
             jsonschema.validate(data, schema)
         return data
     except (TypeError, json.decoder.JSONDecodeError) as e:
-        raise jsonschema.ValidationError("Could not parse json : {0}".format(str(e)))
+        raise jsonschema.ValidationError(
+            "Could not parse json : {0}".format(str(e))
+        ) from e
 
 
 class WSConnection:
@@ -242,11 +246,11 @@ class API:
             try:
                 error_data = parse_error(await response.text())
                 raise DuniterError(error_data)
-            except (TypeError, jsonschema.ValidationError):
+            except (TypeError, jsonschema.ValidationError) as e:
                 raise ValueError(
                     "status code != 200 => %d (%s)"
                     % (response.status, (await response.text()))
-                )
+                ) from e
 
         return response
 
diff --git a/duniterpy/api/endpoint.py b/duniterpy/api/endpoint.py
index c2452d9b2b15e673c395572bc16ca73c9fb0fc69..e171f27a6b1aa09ef4cc2e931c60b793f654e45c 100644
--- a/duniterpy/api/endpoint.py
+++ b/duniterpy/api/endpoint.py
@@ -91,7 +91,7 @@ class UnknownEndpoint(Endpoint):
             properties = inline.split()[1:]
             return cls(api, properties)
         except IndexError:
-            raise MalformedDocumentError(inline)
+            raise MalformedDocumentError(inline) from IndexError
 
     def inline(self) -> str:
         """
diff --git a/duniterpy/documents/block.py b/duniterpy/documents/block.py
index 62a4e27389bb462397273c2052bd428038d4b4bd..087cbc07473548e363a1ecb11dd440d104996a37 100644
--- a/duniterpy/documents/block.py
+++ b/duniterpy/documents/block.py
@@ -299,7 +299,7 @@ class Block(Document):
                 parameters = params_match.groups()
                 n += 1
             except AttributeError:
-                raise MalformedDocumentError("Parameters")
+                raise MalformedDocumentError("Parameters") from AttributeError
 
         members_count = int(Block.parse_field("MembersCount", lines[n]))
         n += 1
diff --git a/duniterpy/documents/block_uid.py b/duniterpy/documents/block_uid.py
index 1811d59f54529575cb676b894180aa89d9f89300..03509a1abaa041f632995ce8f909bf1a24fd24ee 100644
--- a/duniterpy/documents/block_uid.py
+++ b/duniterpy/documents/block_uid.py
@@ -43,12 +43,12 @@ class BlockUID:
         try:
             number = int(data.group(1))
         except AttributeError:
-            raise MalformedDocumentError("BlockUID")
+            raise MalformedDocumentError("BlockUID") from AttributeError
 
         try:
             sha_hash = data.group(2)
         except AttributeError:
-            raise MalformedDocumentError("BlockHash")
+            raise MalformedDocumentError("BlockHash") from AttributeError
 
         return cls(number, sha_hash)
 
diff --git a/duniterpy/documents/document.py b/duniterpy/documents/document.py
index 107dbeb235d2160da247593c4422d543fc637458..05d19162df3d914684598303ee56b0da0529c6dc 100644
--- a/duniterpy/documents/document.py
+++ b/duniterpy/documents/document.py
@@ -68,7 +68,7 @@ class Document:
                 raise AttributeError
             value = match.group(1)
         except AttributeError:
-            raise MalformedDocumentError(field_name)
+            raise MalformedDocumentError(field_name) from AttributeError
         return value
 
     def sign(self, keys: list) -> None:
diff --git a/duniterpy/documents/ws2p/heads.py b/duniterpy/documents/ws2p/heads.py
index b5b028e1daf01879a3daa7ee68defaedcf8ace9b..521811529e07cf146662d6120b307ee277b17f62 100644
--- a/duniterpy/documents/ws2p/heads.py
+++ b/duniterpy/documents/ws2p/heads.py
@@ -54,7 +54,7 @@ class Head:
             version = int(head[1]) if len(head) == 2 else 0
             return cls(version)
         except AttributeError:
-            raise MalformedDocumentError("Head")
+            raise MalformedDocumentError("Head") from AttributeError
 
     def __str__(self) -> str:
         return "HEAD" if self.version == 0 else "HEAD:{}".format(str(self.version))
@@ -93,7 +93,7 @@ class HeadV0(Head):
             offload = data.group(5)
             return cls(head.version, signature, api, head, pubkey, blockstamp), offload
         except AttributeError:
-            raise MalformedDocumentError("HeadV0")
+            raise MalformedDocumentError("HeadV0") from AttributeError
 
     def inline(self) -> str:
         values = (
@@ -155,7 +155,7 @@ class HeadV1(HeadV0):
                 offload,
             )
         except AttributeError:
-            raise MalformedDocumentError("HeadV1")
+            raise MalformedDocumentError("HeadV1") from AttributeError
 
 
 @attr.s
@@ -196,4 +196,4 @@ class HeadV2(HeadV1):
                 "",
             )
         except AttributeError:
-            raise MalformedDocumentError("HeadV2")
+            raise MalformedDocumentError("HeadV2") from AttributeError
diff --git a/tests/api/bma/test_blockchain.py b/tests/api/bma/test_blockchain.py
index fd5b258b54ccc3c12d34c28c80867abdfb9d88a3..62bca0930c440ced658d6e9f35457c8acf0e5146 100644
--- a/tests/api/bma/test_blockchain.py
+++ b/tests/api/bma/test_blockchain.py
@@ -55,8 +55,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, PARAMETERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_parameters_bad(self):
         async def handler(request):
@@ -222,8 +222,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, BLOCK_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_block_bad(self):
         async def handler(request):
@@ -328,15 +328,15 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, BLOCK_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_schema_hardship(self):
         json_sample = {"block": 40432, "level": 4}
         try:
             jsonschema.validate(json_sample, HARDSHIP_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_hardship_bad(self):
         async def handler(request):
@@ -382,8 +382,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, MEMBERSHIPS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_membership_bad(self):
         async def handler(request):
@@ -410,8 +410,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         json_sample = {"result": {"blocks": [223, 813]}}
         try:
             jsonschema.validate(json_sample, BLOCK_NUMBERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_newcomers_bad(self):
         async def handler(request):
@@ -433,8 +433,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         json_sample = {"result": {"blocks": [223, 813]}}
         try:
             jsonschema.validate(json_sample, BLOCK_NUMBERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_certifications_bad(self):
         async def handler(request):
@@ -456,8 +456,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         json_sample = {"result": {"blocks": [223, 813]}}
         try:
             jsonschema.validate(json_sample, BLOCK_NUMBERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_joiners_bad(self):
         async def handler(request):
@@ -479,8 +479,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         json_sample = {"result": {"blocks": [223, 813]}}
         try:
             jsonschema.validate(json_sample, BLOCK_NUMBERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_actives_bad(self):
         async def handler(request):
@@ -502,8 +502,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         json_sample = {"result": {"blocks": [223, 813]}}
         try:
             jsonschema.validate(json_sample, BLOCK_NUMBERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_leavers_bad(self):
         async def handler(request):
@@ -525,8 +525,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         json_sample = {"result": {"blocks": [223, 813]}}
         try:
             jsonschema.validate(json_sample, BLOCK_NUMBERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_schema_blocks(self):
         json_sample = [
@@ -644,8 +644,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         ]
         try:
             jsonschema.validate(json_sample, BLOCKS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_ud_bad(self):
         async def handler(request):
@@ -665,8 +665,8 @@ class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
         json_sample = {"result": {"blocks": [223, 813]}}
         try:
             jsonschema.validate(json_sample, BLOCK_NUMBERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_tx_bad(self):
         async def handler(request):
diff --git a/tests/api/bma/test_network.py b/tests/api/bma/test_network.py
index c803d720b09cb6dd85d7cc43a05ed533b987474c..59d167c2e159c527d205f6e466766fc273cb79b4 100644
--- a/tests/api/bma/test_network.py
+++ b/tests/api/bma/test_network.py
@@ -24,8 +24,8 @@ class TestBmaNetwork(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, network.PEERING_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_peering_bad(self):
         async def handler(request):
@@ -50,8 +50,8 @@ class TestBmaNetwork(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, network.PEERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_peers_leaf(self):
         json_sample = {
@@ -70,8 +70,8 @@ class TestBmaNetwork(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, network.PEERS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_peers_bad(self):
         async def handler(request):
@@ -118,8 +118,8 @@ class TestBmaNetwork(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, network.WS2P_HEADS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_ws2p_heads_bad(self):
         async def handler(request):
diff --git a/tests/api/bma/test_tx.py b/tests/api/bma/test_tx.py
index 52c0dfb0dbd09e1b37ecd6d476fb7121a8c65c78..b3966db1ec6d7fdb1e8e134f558dc80746f5d156 100644
--- a/tests/api/bma/test_tx.py
+++ b/tests/api/bma/test_tx.py
@@ -137,8 +137,8 @@ class TestBmaTx(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, HISTORY_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_bma_tx_history_bad(self):
         async def handler(request):
@@ -195,8 +195,8 @@ class TestBmaTx(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, SOURCES_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_bma_tx_sources_bad(self):
         async def handler(request):
diff --git a/tests/api/bma/test_wot.py b/tests/api/bma/test_wot.py
index 9cd897a2ac711dbe0d41c9efb3138581cbefd75d..dc8478cfde22113e7685caa8c1af43eeef31dae6 100644
--- a/tests/api/bma/test_wot.py
+++ b/tests/api/bma/test_wot.py
@@ -154,8 +154,8 @@ class TestBmaWot(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, LOOKUP_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_bma_wot_lookup_bad(self):
         async def handler(request):
@@ -190,8 +190,8 @@ class TestBmaWot(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(MEMBERS_SCHEMA, json_sample)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_bma_wot_members_bad(self):
         async def handler(request):
@@ -240,8 +240,8 @@ class TestBmaWot(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, CERTIFICATIONS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_bma_wot_certifiers_bad(self):
         async def handler(request):
@@ -358,5 +358,5 @@ class TestBmaWot(WebFunctionalSetupMixin, unittest.TestCase):
         }
         try:
             jsonschema.validate(json_sample, REQUIREMENTS_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
diff --git a/tests/api/bma/test_ws.py b/tests/api/bma/test_ws.py
index d9915904d0009da6cc9ae2736b87e79a33e3ee78..d7b1f1df36dd0833f4ffa951b9e9f5a7900f9e1c 100644
--- a/tests/api/bma/test_ws.py
+++ b/tests/api/bma/test_ws.py
@@ -85,8 +85,8 @@ class TestBmaWebsocket(WebFunctionalSetupMixin, unittest.TestCase):
 """
         try:
             parse_text(json_sample, WS_BLOCK_SCHEMA)
-        except (SchemaError, ValidationError):
-            raise self.failureException
+        except (SchemaError, ValidationError) as e:
+            raise self.failureException from e
 
     def test_peer(self):
         json_sample = """{
diff --git a/tests/key/test_signing_key.py b/tests/key/test_signing_key.py
index 7f7c68843cee0cf8df61d973feb6e5e0717d5fe6..2d8784e2a7adee875374f31dde60a1fdf1e6689c 100644
--- a/tests/key/test_signing_key.py
+++ b/tests/key/test_signing_key.py
@@ -9,7 +9,7 @@ TEST_FILE_PATH = "/tmp/test_file.txt"
 
 class TestSigningKey(unittest.TestCase):
     def tearDown(self) -> None:
-        super(TestSigningKey, self)
+        super()
 
         # remove test file from disk
         if os.path.exists(TEST_FILE_PATH):