4

いつアサートを使用し、いつ例外を使用するかについての情報を読みました。私には不明なのはなぜですか?

例: アサーションは、プログラミング エラー (バグ) を検出する手段としてのみ使用されることを意図しています。対照的に、例外は、他の種類のエラーまたは「例外的な」状態を示すことができます。たとえば、無効なユーザー入力、見つからないファイル、ヒープがいっぱいなどです。

現在:「アサーションは、プログラミングエラー、別名バグを検出する手段としてのみ使用されることを意図しています」-すべてのアサーションが例外に置き換えられたという害は何ですか?例外は同じことをしますか?

「アサートはデバッグのみを目的としており、そのトリガー条件は発生しないはずです。」- : さて、例外を使用してから実行すると、例外がスローされることはありません

私の理解では、例外は無効にできないことを除いて、すべてのアサートを実行できます。アサーションを無効にすることが、使用すべき唯一の理由ですか?

それらを使用する理由ではなく、それらを使用する理由はありますか?

ありがとう

4

7 に答える 7

3

アサートはテスト ケースで使用され、作成したものが将来的に予期しないものをレンダリングしないようにします。たとえば、誤った入力時に例外がスローされるようにアサートできます。

プログラミングで 1 つの変更を行うと、多くの場合、コードの他の部分を変更する必要があります。アサーションは、変更内容によって過去に作成したコードが壊れないようにします。

例外は良いです。それらは予期され、例外を介して処理されます。たとえば、間違ったログインとパスワードの例外があります。

ログインまたはパスワードが正しくないと、予想される例外が発生すると断言できます。

assert には、主に 3 つのものが含まれます。何をテストしているか(関数名、sign_inつまり{'email': 'john@example.com', 'password': hashlib.md5('my_password')}assertTrue('user_name' in response, 'Expecting user_name to be in response!')

例外は、コード内の通常の論理的な代替手段です。アサートは、論理パスがたどられるべきときにたどられることを確認するためのテストです。

python unittest フレームワークに従って、例外がスローされることをアサートできます。

import random import unittest

class TestSequenceFunctions(unittest.TestCase):

    def setUp(self):
        self.seq = range(10)

    def test_shuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))

        # should raise an exception for an immutable sequence
        self.assertRaises(TypeError, random.shuffle, (1,2,3))


    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

if __name__ == '__main__':
    unittest.main()
于 2013-08-07T19:27:31.350 に答える
2

アサーションは選択的にオフにできるように設計されており、デフォルトではオフになっています。決してそうであってはならない状況がある場合にそれらを使用する必要がありますが、本当に必要な場合はチェックすることができます。それらは例外よりも例外的であると考えてください。

例外とそのチェックは常にオンになっています。例外的ですが、いつでも発生する可能性があります。

アサーションはコーディング エラーをチェックできます。プログラムにバグがなければ、アサーションは必要ありません。入力などの制御できない値が原因で、例外がトリガーされる場合があります。

于 2013-08-07T20:03:33.173 に答える
1

多くのプログラマーは、アサートをリリース コードの例外チェックに変換します。または、2 つの異なる種類のアサートを使用して、一方を変換し、他方を変換しない場合があります (パフォーマンスが非常に重要な場合)。

これは防御的プログラミングの一部です。アサートは、不可能な条件を文書化する必要があります。ただし、実際のプログラマーは、テストされていないコード パス、システム ライブラリのバグ、またはハードウェア エラーが原因で、不可能な状況が発生することがあることを知っています。

通常、アサートを例外に変換しても害はほとんどありません。発生する可能性のある害は Java にあり、以前は存在しなかったメソッドに新しい例外タイプが導入される可能性があります。別の問題として、変換された assert が非常に高いパフォーマンスを必要とするループ内にある可能性があり、assert チェックによってループが過度に遅くなる可能性があります。

于 2013-08-07T19:34:18.267 に答える
1

テストコードとは対照的に、作業コードのアサートは、コードに提供された値が正しいことを確認するためにあります。値が間違っている場合、アサーション例外がスローされます。

独自のコードを記述して値をテストし、独自に選択した例外をスローできます。

アサーションは使いやすく、ロギングと同様に、完全にデバッグされた製品コードでオフにすることができます。また、コードを読んでいる人は、何も考えなくてもテストがある理由を知っています。そのため、時間を節約できます。(2 年前に書いたコードに戻って読むときも、時間の節約になります。)

どちらの方法でも機能します。

于 2013-08-07T19:32:50.553 に答える
0

主な違いは、アサートを使用すると、例外よりも早く問題が発生したことを確認できることだと思います。したがって、実行の早い段階で、それについて何かをしようとします (または何もしない - 失敗させてください)。したがって、本当に悪いことが起こる (例外がスローされる) 前に、実行がどのように進んでいるかを確認したい場合に、これらを使用します。

私が思いつく劇的な類推の 1 つは、ISS へのソユーズ配送ロケットです。時折、自動化されたロケットが開始時にコースを外れ、すぐに「自己破壊」を引き起こしたという話を耳にします。ロケットの方向が正しいかどうかを判断するために使用するアサートのようなものだと思います(例外である場合、ロケットが投げられるまでに、すでに何かに当たっている可能性があります)。

于 2013-08-07T19:36:32.290 に答える