doc: add documentation for TRY002 (#2655)

This commit is contained in:
Nuno Mendes 2023-02-08 17:04:31 +01:00 committed by GitHub
parent 3862dc2626
commit 9cd1bf9c03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 123 additions and 1 deletions

View File

@ -1368,7 +1368,7 @@ For more, see [tryceratops](https://pypi.org/project/tryceratops/1.1.0/) on PyPI
| Code | Name | Message | Fix | | Code | Name | Message | Fix |
| ---- | ---- | ------- | --- | | ---- | ---- | ------- | --- |
| TRY002 | raise-vanilla-class | Create your own exception | | | [TRY002](https://github.com/charliermarsh/ruff/blob/main/docs/rules/raise-vanilla-class.md) | [raise-vanilla-class](https://github.com/charliermarsh/ruff/blob/main/docs/rules/raise-vanilla-class.md) | Create your own exception | |
| TRY003 | raise-vanilla-args | Avoid specifying long messages outside the exception class | | | TRY003 | raise-vanilla-args | Avoid specifying long messages outside the exception class | |
| TRY004 | prefer-type-error | Prefer `TypeError` exception for invalid type | 🛠 | | TRY004 | prefer-type-error | Prefer `TypeError` exception for invalid type | 🛠 |
| TRY200 | reraise-no-cause | Use `raise from` to specify exception cause | | | TRY200 | reraise-no-cause | Use `raise from` to specify exception cause | |

View File

@ -7,6 +7,46 @@ use crate::registry::Diagnostic;
use crate::violation::Violation; use crate::violation::Violation;
define_violation!( define_violation!(
/// ### What it does
/// Checks for code that raises `Exception` directly.
///
/// ### Why is this bad?
/// Handling such exceptions requires the use of `except Exception`, which
/// captures _any_ raised exception, including failed assertions,
/// division by zero, and more.
///
/// Prefer to raise your own exception, or a more specific built-in
/// exception, so that you can avoid over-capturing exceptions that you
/// don't intend to handle.
///
/// ### Example
/// ```py
/// def main_function():
/// if not cond:
/// raise Exception()
/// def consumer_func():
/// try:
/// do_step()
/// prepare()
/// main_function()
/// except Exception:
/// logger.error("Oops")
/// ```
///
/// Use instead:
/// ```py
/// def main_function():
/// if not cond:
/// raise CustomException()
/// def consumer_func():
/// try:
/// do_step()
/// prepare()
/// main_function()
/// except CustomException:
/// logger.error("Main function failed")
/// except Exception:
/// logger.error("Oops")
pub struct RaiseVanillaClass; pub struct RaiseVanillaClass;
); );
impl Violation for RaiseVanillaClass { impl Violation for RaiseVanillaClass {

View File

@ -0,0 +1,44 @@
# raise-vanilla-class (TRY002)
Derived from the **tryceratops** linter.
### What it does
Checks for code that raises `Exception` directly.
### Why is this bad?
Handling such exceptions requires the use of `except Exception`, which
captures _any_ raised exception, including failed assertions,
division by zero, and more.
Prefer to raise your own exception, or a more specific built-in
exception, so that you can avoid over-capturing exceptions that you
don't intend to handle.
### Example
```py
def main_function():
if not cond:
raise Exception()
def consumer_func():
try:
do_step()
prepare()
main_function()
except Exception:
logger.error("Oops")
```
Use instead:
```py
def main_function():
if not cond:
raise CustomException()
def consumer_func():
try:
do_step()
prepare()
main_function()
except CustomException:
logger.error("Main function failed")
except Exception:
logger.error("Oops")

View File

@ -0,0 +1,38 @@
# raise-vanilla-class (TRY002)
Derived from the **tryceratops** linter.
### What it does
Checks for bare exceptions.
## Why is this bad?
It's hard to capture generic exceptions making it hard for handling specific scenarios.
## Example
```py
def main_function():
if not cond:
raise Exception()
def consumer_func():
try:
do_step()
prepare()
main_function()
except Exception:
logger.error("I have no idea what went wrong!!")
```
## How it should be
```py
def main_function():
if not cond:
raise CustomException()
def consumer_func():
try:
do_step()
prepare()
main_function()
except CustomException:
logger.error("Main function failed")
except Exception:
logger.error("I have no idea what went wrong!!")
```