diff --git a/invenio_utilities_tuw/cli/drafts.py b/invenio_utilities_tuw/cli/drafts.py
index 3d7e840439d224e00845f1271ec89a3a2835fdc0..993c65cc9af8697d292758ea9c1beb30c06c2b8a 100644
--- a/invenio_utilities_tuw/cli/drafts.py
+++ b/invenio_utilities_tuw/cli/drafts.py
@@ -17,6 +17,7 @@ import click
 from flask.cli import with_appcontext
 from invenio_access.permissions import system_identity
 from invenio_db import db
+from invenio_records_resources.services.errors import PermissionDeniedError
 
 from ..utils import get_identity_for_user, get_record_service, get_user_by_identifier
 from .options import (
@@ -67,7 +68,7 @@ def list_drafts(user):
                 num_files = "no"
 
             click.secho(f"{recid}\t{num_files} files\t{title}", fg="green")
-        except:
+        except PermissionDeniedError:
             pass
 
 
@@ -111,7 +112,7 @@ def create_draft(metadata_path, publish, user, owners, vanity_pid):
         metadata_file_path = join(metadata_path, "metadata.json")
         deposit_files_path = join(metadata_path, "files")
         if not isfile(metadata_file_path):
-            raise Exception("metadata file does not exist: %s" % metadata_file_path)
+            raise FileNotFoundError(metadata_file_path)
 
         metadata = read_metadata(metadata_file_path)
         draft = create_record_from_metadata(metadata, identity)
@@ -143,7 +144,7 @@ def create_draft(metadata_path, publish, user, owners, vanity_pid):
             file_service.commit_file(id_=recid, file_key=fn, identity=identity)
 
     else:
-        raise Exception("neither a file nor a directory: %s" % metadata_path)
+        raise TypeError(f"neither a file nor a directory: {metadata_path}")
 
     if owners:
         owners = [get_user_by_identifier(owner) for owner in owners]
diff --git a/invenio_utilities_tuw/cli/files.py b/invenio_utilities_tuw/cli/files.py
index 258d5f6b9765bef4e25fb3f9e69a197c0ddcb6fe..f85541bb1b85f1514b90a041b036d03ccd89e0cb 100644
--- a/invenio_utilities_tuw/cli/files.py
+++ b/invenio_utilities_tuw/cli/files.py
@@ -142,8 +142,11 @@ def hard_delete_files(pid, pid_type):
                 fi.delete()
                 storage.delete()
                 click.secho("{}\t{}".format(key, fi.uri), fg="red")
-            except:
-                click.secho("cannot delete file: %s" % fi.uri, fg="yellow")
+
+            except Exception as error:
+                click.secho(
+                    f"cannot delete file '{fi.uri}': {error}", fg="yellow", err=True
+                )
 
     db.session.commit()
 
diff --git a/invenio_utilities_tuw/cli/records.py b/invenio_utilities_tuw/cli/records.py
index 65e93b593cb90a556afbc8f7011c2e534dd5c910..6fbbcb8cb26c1b094485cf76c349b23cccd827d6 100644
--- a/invenio_utilities_tuw/cli/records.py
+++ b/invenio_utilities_tuw/cli/records.py
@@ -14,6 +14,7 @@ import sys
 import click
 from flask.cli import with_appcontext
 from invenio_db import db
+from invenio_records_resources.services.errors import PermissionDeniedError
 
 from ..utils import get_identity_for_user, get_record_service, get_user_by_identifier
 from .options import (
@@ -60,7 +61,7 @@ def list_records(user):
                 num_files = "no"
 
             click.secho(f"{recid}\t{num_files} files\t{title}", fg="green")
-        except:
+        except PermissionDeniedError:
             pass
 
 
diff --git a/invenio_utilities_tuw/cli/utils.py b/invenio_utilities_tuw/cli/utils.py
index 041ef6656483bbce297ba9783fe6fde75fc31436..686a7206531e7ccdaafd1341dba5813e68fab85f 100644
--- a/invenio_utilities_tuw/cli/utils.py
+++ b/invenio_utilities_tuw/cli/utils.py
@@ -11,6 +11,7 @@
 import json
 
 from invenio_db import db
+from invenio_pidstore.errors import PIDAlreadyExists
 from invenio_pidstore.models import PersistentIdentifier
 
 from ..utils import get_record_service
@@ -23,7 +24,7 @@ def read_metadata(metadata_file_path):
         metadata = json.load(metadata_file)
 
     if metadata is None:
-        raise Exception("not a valid json file: %s" % metadata_file_path)
+        raise TypeError(f"not a valid json file: {metadata_file_path}")
 
     return metadata
 
@@ -41,9 +42,7 @@ def create_record_from_metadata(
         ).count()
 
         if count > 0:
-            raise Exception(
-                "PID '{}:{}' is already taken".format(vanity_pid_type, vanity_pid)
-            )
+            raise PIDAlreadyExists(pid_type=vanity_pid_type, pid_value=vanity_pid)
 
     draft = service.create(identity=identity, data=metadata)._record