Skip to content

Conversation

toxadx
Copy link
Contributor

@toxadx toxadx commented Jan 29, 2025

FileNotFoundError can be processed in exception_handlers

Summary

Avoid handling FileNotFoundError in FileResponse.
This allows FileNotFoundError to be properly handled using exception_handlers, for example, by returning a 404 error when a file is not found.

Checklist

  • I understand that this PR may be closed in case there was no previous discussion. (This doesn't apply to typos!)
  • I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
  • I've updated the documentation accordingly.

Copy link
Owner

@Kludex Kludex left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you show me a real example of what you are trying to do?

The client asks for a file, and you use FileResponse? What about StaticFiles?

@@ -341,7 +341,7 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
stat_result = await anyio.to_thread.run_sync(os.stat, self.path)
self.set_stat_headers(stat_result)
except FileNotFoundError:
raise RuntimeError(f"File at path {self.path} does not exist.")
pass
else:
mode = stat_result.st_mode
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 lines below, we have another RuntimeError.

Also, this is a breaking change.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can raise a new exception derived from both RuntimeError and FileNotFoundError. This way we can keep backward compatibility.

class NotFoundError(FileNotFoundError, RuntimeError): ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants