From 517c651c97a3759ed8f0002bdc3486ed8d67c6b9 Mon Sep 17 00:00:00 2001
From: felinae98 <731499577@qq.com>
Date: Sun, 31 Jul 2022 23:13:59 +0800
Subject: [PATCH] provides method to avoid update status when api error

---
 src/plugins/nonebot_bison/platform/bilibili.py | 2 +-
 src/plugins/nonebot_bison/platform/platform.py | 9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/plugins/nonebot_bison/platform/bilibili.py b/src/plugins/nonebot_bison/platform/bilibili.py
index 9f58534..7d5a763 100644
--- a/src/plugins/nonebot_bison/platform/bilibili.py
+++ b/src/plugins/nonebot_bison/platform/bilibili.py
@@ -201,7 +201,7 @@ class Bilibililive(StatusChange):
                 info["cover"] = res_dict["data"]["live_room"]["cover"]
                 return info
             else:
-                return []
+                raise self.ParseTargetException(res.text)
 
     def compare_status(self, target: Target, old_status, new_status) -> list[RawPost]:
         if (
diff --git a/src/plugins/nonebot_bison/platform/platform.py b/src/plugins/nonebot_bison/platform/platform.py
index 22c1200..d0e2cf6 100644
--- a/src/plugins/nonebot_bison/platform/platform.py
+++ b/src/plugins/nonebot_bison/platform/platform.py
@@ -268,6 +268,9 @@ class NewMessage(MessageProcess, abstract=True):
 class StatusChange(Platform, abstract=True):
     "Watch a status, and fire a post when status changes"
 
+    class FetchError(RuntimeError):
+        pass
+
     @abstractmethod
     async def get_status(self, target: Target) -> Any:
         ...
@@ -283,7 +286,11 @@ class StatusChange(Platform, abstract=True):
     async def fetch_new_post(
         self, target: Target, users: list[UserSubInfo]
     ) -> list[tuple[User, list[Post]]]:
-        new_status = await self.get_status(target)
+        try:
+            new_status = await self.get_status(target)
+        except self.FetchError as err:
+            logger.warning(f"fetching {self.name}-{target} error: {err}")
+            return []
         res = []
         if old_status := self.get_stored_data(target):
             diff = self.compare_status(target, old_status, new_status)