Google resource manager get all exceptions – Python

Question:

im making a python script that can manage my google projects.
im having a insue with one part
when i try to exclude the project its can return to me many errors.

i did a peace of code to get this exception:

        try:
            # Initialize request argument(s)

            request = DeleteProjectRequest(
                name=project,
            )
            self.project_manager.delete_project(request=request)

        except PermissionDenied as exc:
            # GCP returns PermissionDenied whether we actually does
            # not have permissions to perform the get_project call
            # or when the project does not exist. Due to this reason,
            # the PermissionDenied exception catch won't be deterministic.
            logger.error(f"Project '{project_id}' does not exist", exc)
            return False

i need to get the error message of all types of errors
i changed except PermissionDenied as exc: for except Exception as exc:
and it works but i need to call the logger only if the error is PermissionDenied and in all cases i need to call another function passing the message as parameter like it return_to_db(error_message)

my question is. how can i run only the logger if the error is PermissionDenied?

Asked By: Jasar Orion

||

Answers:

You can add a condition of the instance type of the current exception in Python, example :

        try:
            # Initialize request argument(s)

            request = DeleteProjectRequest(
                name=project,
            )
            self.project_manager.delete_project(request=request)

        except Exception as exc:
            if isinstance(exc, PermissionDenied):
               logger.error(f"Project '{project_id}' does not exist", exc)
            
        return False

As expected, the logger is executed only if the exception instance is PermissionDenied.

Answered By: Mazlum Tosun

You can also catch multiple Exceptions by adding additional blocks, though it will choose the first isinstance() match (so if you put Exception first, it will be selected instead, while TypeError would be continued past)

try:
    self.project_manager.delete_project(
        request=DeleteProjectRequest(name=project))
except PermissionDenied as exc:
    # GCP returns PermissionDenied whether we actually does
    # not have permissions to perform the get_project call
    # or when the project does not exist. Due to this reason,
    # the PermissionDenied exception catch won't be deterministic.
    logger.error(f"Project '{project_id}' does not exist", exc)
except Exception:
    # FIXME other handling to go here
    pass  # fall to return False
else:  # didn't raise
    return True
# opportunity for finally: block here too

# if any Exception was raised, continue to return False
return False
Answered By: ti7
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.