diff --git a/src/quorum/apis/governance/aave_governance.py b/src/quorum/apis/governance/aave_governance.py index 76fa441..bed185c 100644 --- a/src/quorum/apis/governance/aave_governance.py +++ b/src/quorum/apis/governance/aave_governance.py @@ -2,6 +2,7 @@ from quorum.apis.governance.data_models import BGDProposalData, PayloadAddresses from quorum.utils.chain_enum import Chain +from quorum.utils.exceptions import ProposalNotFoundException BASE_BGD_CACHE_REPO = "https://raw.githubusercontent.com/bgd-labs/v3-governance-cache/refs/heads/main/cache" PROPOSALS_URL = ( @@ -45,7 +46,10 @@ def get_proposal_data(self, proposal_id: int) -> BGDProposalData: """ proposal_data_link = f"{PROPOSALS_URL}/{proposal_id}.json" resp = self.session.get(proposal_data_link) - resp.raise_for_status() + try: + resp.raise_for_status() + except requests.HTTPError as e: + raise ProposalNotFoundException(proposal_id, "Aave", e.response) from e raw_json = resp.json() # Parse into our data model diff --git a/src/quorum/auto_report/aave_tags.py b/src/quorum/auto_report/aave_tags.py index 3fa09cd..b518f3e 100644 --- a/src/quorum/auto_report/aave_tags.py +++ b/src/quorum/auto_report/aave_tags.py @@ -15,6 +15,9 @@ SEATBELT_PAYLOADS_URL = f"{BASE_SEATBELT_REPO}/payloads" +class ProposalInfoNotFoundException(Exception): ... + + class ChainInfo(BaseModel): name: str block_explorer_link: str @@ -65,7 +68,6 @@ def get_aave_tags(proposal_id: int) -> dict[str, Any]: """ api = AaveGovernanceAPI() bgd_data: BGDProposalData = api.get_proposal_data(proposal_id) - # Safely unwrap fields (some might be None). ipfs_data: IPFSData = bgd_data.ipfs or IPFSData() proposal_data: ProposalData = bgd_data.proposal or ProposalData() diff --git a/src/quorum/entry_points/implementations/create_report.py b/src/quorum/entry_points/implementations/create_report.py index 895eff4..188ea37 100644 --- a/src/quorum/entry_points/implementations/create_report.py +++ b/src/quorum/entry_points/implementations/create_report.py @@ -5,6 +5,7 @@ import quorum.auto_report.aave_tags as aave_tags import quorum.utils.pretty_printer as pp +from quorum.utils.exceptions import ProposalNotFoundException def run_create_report(args: argparse.Namespace): @@ -40,7 +41,11 @@ def run_create_report(args: argparse.Namespace): pp.pprint( f"Retrieving tag information for proposal {args.proposal_id}", pp.Colors.INFO ) - tags = aave_tags.get_aave_tags(args.proposal_id) + try: + tags = aave_tags.get_aave_tags(args.proposal_id) + except ProposalNotFoundException as e: + pp.pprint(e, pp.Colors.FAILURE) + return pp.pprint("Tag information retrieved", pp.Colors.INFO) report = template.render(tags) diff --git a/src/quorum/utils/exceptions.py b/src/quorum/utils/exceptions.py new file mode 100644 index 0000000..42896d5 --- /dev/null +++ b/src/quorum/utils/exceptions.py @@ -0,0 +1,17 @@ +import requests + + +class ProposalNotFoundException(Exception): + def __init__( + self, proposal_id: int, project_name: str, response: requests.Response + ): + super().__init__() + self.proposal_id = proposal_id + self.project_name = project_name + self.response = response + + def __str__(self): + return ( + f"Proposal id {self.proposal_id} for {self.project_name} could not be found " + f"at url {self.response.url} (error code {self.response.status_code})" + )