Directly raising exception from 'Exception' instance

オープン
#321 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
半日
初心者へのやさしさ
45/100
issue の種類
リファクタリング
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
python
領域
cloud

調査の方向性

Four bare raise Exception(...) sites are named: b2sdk/sync/action.py (around line 244), b2sdk/v1/download_dest.py (get_bytes_written), and two in b2sdk/v1/sync/folder.py (the except branches for NotADirectory and UnableToCreateDirectory). Read the existing exception classes in the package first, since the issue asks for a more specific built-in or custom exception but does not choose one. Done means each site raises a specific type, the existing tests in the sync and download suites still pass, and callers that catch the old generic exception are checked.

索引モデルが issue の本文から書いたものです。

説明

OpenRefactory introduces fixers, that automatically fix safety, security, reliability and compliance issues. We ran OpenRefactory's Intelligent Code Repair (iCR) analysis engine on your code. We are reporting a few sample fixes that were generated.

Throwing overly broad exceptions promotes complex error handling code that is more likely to contain security vulnerabilities. It will become challenging to catch only specific types of exceptions. The best practice is to catch only exceptions which require specific handling.

Raising Exception in a function will lead to having an except Exception and the only way to differentiate between different exceptions is by comparing the exception messages. Moreover, one could forget to re-raise some exceptions which are unintentionally caught.

OpenRefactory’s Intelligent Code Repair (iCR) for Python, identified four such cases. The diffs are the following:

--- /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/sync/action.py
+++ /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/sync/action.py
@@ -241,6 +241,8 @@
             except OSError:
                 pass
         if not os.path.isdir(parent_dir):
+            # OpenRefactory Warning: Raising 'Exception' and 'BaseException' directly will have a negative impact on any code trying to catch these exceptions.
+            # Raise a more specific built-in exception or, create a custom one.
             raise Exception('could not create directory %s' % (parent_dir,))
 
     def do_action(self, bucket, reporter):
--- /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/v1/download_dest.py
+++ /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/v1/download_dest.py
@@ -175,6 +175,8 @@
 
     def get_bytes_written(self):
         if self.bytes_written is None:
+            # OpenRefactory Warning: Raising 'Exception' and 'BaseException' directly will have a negative impact on any code trying to catch these exceptions.
+            # Raise a more specific built-in exception or, create a custom one.
             raise Exception('data not written yet')
         return self.bytes_written
--- /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/v1/sync/folder.py
+++ /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/v1/sync/folder.py
@@ -22,6 +22,8 @@
         try:
             return func(*a, **kw)
         except exception.NotADirectory as ex:
+            # OpenRefactory Warning: Raising 'Exception' and 'BaseException' directly will have a negative impact on any code trying to catch these exceptions.
+            # Raise a more specific built-in exception or, create a custom one.
             raise Exception('%s is not a directory' % (ex.path,))
         except exception.UnableToCreateDirectory as ex:
             raise Exception('unable to create directory %s' % (ex.path,))
--- /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/v1/sync/folder.py
+++ /home/nhasan/ORTest/PythonTest/b2-sdk-python/b2sdk/v1/sync/folder.py
@@ -24,6 +24,8 @@
         except exception.NotADirectory as ex:
             raise Exception('%s is not a directory' % (ex.path,))
         except exception.UnableToCreateDirectory as ex:
+            # OpenRefactory Warning: Raising 'Exception' and 'BaseException' directly will have a negative impact on any code trying to catch these exceptions.
+            # Raise a more specific built-in exception or, create a custom one.
             raise Exception('unable to create directory %s' % (ex.path,))
         except exception.EmptyDirectory as ex:
             raise exception.CommandError(

Reference: CWE-397: Declaration of Throws for Generic Exception


Reported by OpenRefactory’s Intelligent Code Repair (iCR) for Python v1.0. More info at: https://www.openrefactory.com/

主要言語
Python
スター
214
フォーク
68
平均マージ
51分
マージ済み PR(30日)
6

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

Backblaze/b2-sdk-python のほかの issue

Backblaze/b2-sdk-python の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。