Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #1184 Add exception handling for socket mode - BlockingIOError: Resource temporarily unavailable #1185

Merged
merged 1 commit into from Feb 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
13 changes: 11 additions & 2 deletions slack_sdk/socket_mode/builtin/client.py
Expand Up @@ -247,10 +247,15 @@ def _on_message(self, message: str):
listener(message)

def _on_error(self, error: Exception):
self.logger.exception(
error_message = (
f"on_error invoked (session id: {self.session_id()}, "
f"error: {type(error).__name__}, message: {error})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

for listener in self.on_error_listeners:
listener(error)

Expand Down Expand Up @@ -281,10 +286,14 @@ def _run_current_session(self):
f" (session id: {session_id})"
)
except Exception as e:
self.logger.exception(
error_message = (
"Failed to start or stop the current session"
f" (session id: {session_id}, error: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

def _monitor_current_session(self):
if self.current_app_monitor_started:
Expand Down
34 changes: 27 additions & 7 deletions slack_sdk/socket_mode/builtin/connection.py
Expand Up @@ -167,9 +167,11 @@ def connect(self) -> None:
if e.args and len(e.args) > 1 and isinstance(e.args[0], int):
code = e.args[0]
if code is not None:
self.logger.exception(
f"Error code: {code} (session id: {self.session_id}, error: {e})"
)
error_message = f"Error code: {code} (session id: {self.session_id}, error: {e})"
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)
raise

except Exception as e:
Expand Down Expand Up @@ -300,10 +302,15 @@ def check_state(self) -> None:
)
self.consecutive_check_state_error_count = 0
except Exception as e:
self.logger.exception(
error_message = (
"Failed to check the state of sock "
f"(session id: {self.session_id}, error: {type(e).__name__}, message: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

self.consecutive_check_state_error_count += 1
if self.consecutive_check_state_error_count >= 5:
self.disconnect()
Expand Down Expand Up @@ -452,28 +459,41 @@ def run_until_completion(self, state: ConnectionState) -> None:
if self.on_error_listener is not None:
self.on_error_listener(e)
else:
self.logger.exception(
error_message = (
"Got an OSError while receiving data"
f" (session id: {self.session_id}, error: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

# As this connection no longer works in any way, terminating it
if self.is_active():
try:
self.disconnect()
except Exception as disconnection_error:
self.logger.exception(
error_message = (
"Failed to disconnect"
f" (session id: {self.session_id}, error: {disconnection_error})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)
state.terminated = True
break
except Exception as e:
if self.on_error_listener is not None:
self.on_error_listener(e)
else:
self.logger.exception(
error_message = (
"Got an exception while receiving data"
f" (session id: {self.session_id}, error: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

state.terminated = True