mirror of https://github.com/astral-sh/ruff
doc: add documentation for TRY002 (#2655)
This commit is contained in:
parent
3862dc2626
commit
9cd1bf9c03
|
|
@ -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 | |
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
@ -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!!")
|
||||||
|
```
|
||||||
Loading…
Reference in New Issue