イールドリターンと例外処理

ステファン・ライアー

期待したArgumentExceptionをスローしないyieldreturnを使用するメソッドのケースがありました。私はここで可能な限り単純なクラスでケースを再構築しました:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var listA = FooA(count: 0);
            Console.WriteLine("A did not throw exception!");
        }
        catch (ArgumentException)
        {
            Console.WriteLine("A threw exception!");
        }

        try
        {
            var listB = FooB(count: 0);
            Console.WriteLine("B did not throw exception!");
        }
        catch (ArgumentException)
        {
            Console.WriteLine("B threw exception!");
        }

        Console.ReadLine();
    }

    private static IEnumerable<int> FooA(int count)
    {
        if(count == 0)
            throw new ArgumentException("Count must be above 0");
        var list = new List<int>();
        for (var i = 0; i < count; i++)
        {
            list.Add(i);
        }
        return list;
    }

    private static IEnumerable<int> FooB(int count)
    {
        if (count == 0)
            throw new ArgumentException("Count must be above 0");
        for (var i = 0; i < count; i++)
        {
            yield return i;
        }
    }
}

出力:

A threw exception!
B did not throw exception!

FooAが例外をスローするのにFooBが例外をスローしない理由を誰かに説明してもらえますか?

DrewJordan

それFooBは決して評価されないからです。

メソッドを呼び出すと、そのメソッドがすぐに呼び出されます。yield列挙可能オブジェクトを使用して返す場合、そのメソッドは、返された値を使用する必要がある場合にのみ呼び出され、一度に1つのアイテムのみが呼び出されます。これがyieldingのメリットです

したがって、値を使用するものを追加すると

try
{
    var listB = FooB(count: 0);
    Console.WriteLine(listB.First()); // use the IEnumerable returned
    Console.WriteLine("B did not throw exception!");
}
catch (ArgumentException)
{
    Console.WriteLine("B threw exception!");
}

期待どおりの結果が表示されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaメインメソッドでのループと例外処理

分類Dev

例外処理パターン

分類Dev

例外がスローされた後、SFTPインバウンドアダプターポーリングで残りのファイルを処理する方法

分類Dev

委任ハンドラーのフォーマッターでの逆シリアル化例外の処理

分類Dev

リーダーとライターを閉じるための例外処理

分類Dev

リモートコンピュータでexeファイルを実行する際の未処理の例外

分類Dev

phpメーラーでのデータ変数の処理とphpファイルのインクルード

分類Dev

バックグラウンドタスクのグローバル例外処理

分類Dev

OCamlストリーム:例外処理またはオプションタイプ?

分類Dev

例外-ミドルウェアとページの処理

分類Dev

Java のオーバーライドされたインターフェースでの例外の処理

分類Dev

PySparkストリームデータの処理と処理済みデータのファイルへの保存

分類Dev

Angular:エラー処理-インターセプターとモーダル

分類Dev

例外処理と文字列コンバータ

分類Dev

例外を処理するサンプルコード

分類Dev

Androidインターセプトの未処理の例外

分類Dev

リーフレットとノードでの大きなデータセットポイントの処理

分類Dev

Nodejsイベントループ例外処理

分類Dev

インクルードと配列値を使用して配列をフィルター処理する

分類Dev

PHP - タイムゾーンのリストを配列としてフィルター処理する

分類Dev

センサーデータの処理に使用するアルゴリズムとライブラリ

分類Dev

Azure モバイル アプリ テーブル コントローラーでの例外処理

分類Dev

AWSCodePipelineでのランタイムとビルドタイムのシークレットの処理

分類Dev

エラーと例外処理

分類Dev

ルームエラー処理を伴うRxJava2-データベースのメインスレッド例外

分類Dev

イオンリターンフィルター処理されたjson配列

分類Dev

JSFファイルのダウンロード例外処理(ビューの再レンダリングを防ぐ方法)

分類Dev

例外処理のループ

分類Dev

前処理されたデータとハイチャートでのドリルダウンの組み合わせ

Related 関連記事

  1. 1

    Javaメインメソッドでのループと例外処理

  2. 2

    例外処理パターン

  3. 3

    例外がスローされた後、SFTPインバウンドアダプターポーリングで残りのファイルを処理する方法

  4. 4

    委任ハンドラーのフォーマッターでの逆シリアル化例外の処理

  5. 5

    リーダーとライターを閉じるための例外処理

  6. 6

    リモートコンピュータでexeファイルを実行する際の未処理の例外

  7. 7

    phpメーラーでのデータ変数の処理とphpファイルのインクルード

  8. 8

    バックグラウンドタスクのグローバル例外処理

  9. 9

    OCamlストリーム:例外処理またはオプションタイプ?

  10. 10

    例外-ミドルウェアとページの処理

  11. 11

    Java のオーバーライドされたインターフェースでの例外の処理

  12. 12

    PySparkストリームデータの処理と処理済みデータのファイルへの保存

  13. 13

    Angular:エラー処理-インターセプターとモーダル

  14. 14

    例外処理と文字列コンバータ

  15. 15

    例外を処理するサンプルコード

  16. 16

    Androidインターセプトの未処理の例外

  17. 17

    リーフレットとノードでの大きなデータセットポイントの処理

  18. 18

    Nodejsイベントループ例外処理

  19. 19

    インクルードと配列値を使用して配列をフィルター処理する

  20. 20

    PHP - タイムゾーンのリストを配列としてフィルター処理する

  21. 21

    センサーデータの処理に使用するアルゴリズムとライブラリ

  22. 22

    Azure モバイル アプリ テーブル コントローラーでの例外処理

  23. 23

    AWSCodePipelineでのランタイムとビルドタイムのシークレットの処理

  24. 24

    エラーと例外処理

  25. 25

    ルームエラー処理を伴うRxJava2-データベースのメインスレッド例外

  26. 26

    イオンリターンフィルター処理されたjson配列

  27. 27

    JSFファイルのダウンロード例外処理(ビューの再レンダリングを防ぐ方法)

  28. 28

    例外処理のループ

  29. 29

    前処理されたデータとハイチャートでのドリルダウンの組み合わせ

ホットタグ

アーカイブ