.NETライブラリのパターンを処理する例外-処理するか、無人のままにするか、再スローしますか?

Xpleria

私はC#ライブラリを作成しています。このライブラリは、DLL後で他のアプリケーションのコードで使用されます。

ライブラリに、などの例外をスローする可能性のあるステートメントがある場合System.IO.IOException、それ自体をキャッチする必要がありますか、それともそれを使用するアプリケーションのプログラムによってキャッチされるように残す必要がありますか?

私はこれを尋ねます、なぜなら私は私の図書館で例外を捕まえていなかったからです。(ライブラリを使用する)アプリケーションをデバッグすると、VisualStudioはライブラリ内の未処理の例外としてアプリケーションを表示します。しかし、私がする> Continueと、プログラムは続行され、例外はアプリケーションによってキャッチされます。正常に動作しているようです。

さて、これを行っても大丈夫ですか?つまり、アプリケーションがデプロイされたときに問題が発生する可能性がありますか?それとも、それは絶対にライブラリ自体に捕らえられるべきですか?それとも、MSDNはどこかで、これよりも優れたものを「ベストプラクティス」として提案していますか?

Jacek Blaszczynski

良い図書館を書くことは芸術と科学です。提供される機能をすでに決定し、関連するAPIをライブラリの利用者に公開していると仮定すると、1つの問題、つまり例外処理が未解決のままであるように思われます。

一般に、ライブラリコードの実行中に発生する例外は、次の2つのグループに分けることができます。1。ライブラリの実装と機能に依存します。2.消費者またはシステムに依存し、ライブラリの関心領域外。

IMHOのベストプラクティスは、ライブラリコードによってスローされるすべての例外を定義し、それらをApplicationExceptionlib固有のプレフィックス(:<LibShortName>FormatExceptionまたは<LibShortName>InvalidOperationException。)を使用して関連する.NET例外から派生させることです。次に、ライブラリがクライアントコードに例外をスローする必要がある場合は、ライブラリから派生した例外を使用します。

ライブラリの外部で発生した例外があり、それらがライブラリ機能の観点から意味がある場合は、それらをキャッチして、すでにキャッチされた例外を内部例外として含む新しいライブラリ例外をスローするか<LibShortName>AggregateException、クライアントに公開する前に例外のチェーンを作成するために使用できます。

上記のスキームは、多くの一般的な.NETライブラリ(SharpSkia)で使用されています。この問題には他にもアプローチがありますが、上記のアプローチは図書館の利用者にとって最も有益であると思います。彼らはエラーに関するできるだけ多くの情報を入手します。さらに、例外のキャッチと処理にタイプベースのパターンを簡単に使用できます。

優れたライブラリを作成する上で最も重要な側面の1つは、パフォーマンスです。ライブラリに最適なものを取得するには、コード内の制御フローに例外を使用しないでください。例外は、エラー状態にのみ使用する必要があります。上記のパターンに違反する悪いデザインの良い例の1つは、ANTLR C# parser framewrokAFAIRv2でした。ある段階で、ライブラリは解析ロジックを制御するために例外を使用していましたが、これは非常に非効率的でした。その後、エラー状態に対してのみ例外を使用するようにリファクタリングされ、パフォーマンスが数桁向上しました。

最後に、.NETライブラリAPIの設計に関する最高の本の1つは次のとおりです。

興味深いAPI Reviews読み物は、.NET Core corefxリポジトリからのクローズドおよびオープンの問題と、少し古いがまだ古典的なものである、General APIDesignでタグ付けされたKrzysztofCwalinaブログ投稿に関するディスカッションです。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

非同期ライブラリには、パイプラインを処理するための制御フローがありますか?

分類Dev

Android Gradleプラグインは、ライブラリ内の競合するリソースをどのように処理しますか?

分類Dev

ファクトリデザインパターンで長さが異なるコンストラクタをどのように処理しますか?

分類Dev

プロセスの未処理の例外ハンドラーを無効にできますか?

分類Dev

既存の実行中のパイプラインを再デプロイすると、Readyタイムスライスが再度処理されますか?

分類Dev

Springのカスタム例外ハンドラーの内部からスローされた例外を処理する方法はありますか?

分類Dev

未処理の例外ハンドラーを使用すると、例外ディスパッチはどのように変化しますか?

分類Dev

RESTful API からのライブ データを処理する

分類Dev

getMessage()からのメッセージに関する例外を処理します

分類Dev

Lombok Builderは、例外をスローする可能性のあるコンストラクターを処理できますか?

分類Dev

リポジトリレイヤーでスローされた例外を処理するための汎用のSpring-dataExceptionクラスはありますか?

分類Dev

ASP.NET Web API 2で*すべて*の例外処理を無効にしますか(自分用のスペースを確保するため)?

分類Dev

親クラスの例外をスローすると、サブクラスの例外がキャッチ/処理されても、そのサブクラスの例外イベントがスローされますか?

分類Dev

Yii2:致命的なエラーにのみエラーハンドラーを使用するか、処理されるエラータイプを指定します

分類Dev

遅いIOを処理しない場合、パフォーマンスの観点からリアクティブプログラミングを使用することは理にかなっていますか?

分類Dev

Python 2の例外内でエラーを処理しますか?

分類Dev

未処理の例外をvb.netクラスライブラリプロジェクトに記録するにはどうすればよいですか?

分類Dev

マイクロサービスのスケーリング中にRedisサブスクライブします。そのうちの1つだけにリクエストを処理させるにはどうすればよいですか?

分類Dev

Visual Studioが、サードパーティのライブラリでスローおよび処理された例外で中断するのはなぜですか?

分類Dev

重大なエラー処理のために、非同期ベースのライブラリはどのAPIを提供する必要がありますか?

分類Dev

ldは、(ソースファイルとライブラリで)2回提供されるコードをどのように処理しますか?

分類Dev

アプリケーションランタイムで権限の取り消しをどのように処理する必要がありますか?

分類Dev

タイムライブラリの例外を処理する方法は?

分類Dev

Wi-FiルーターはクライアントのDHCPを処理する必要がありますか?

分類Dev

宣言型パイプラインでグローバル変数をどのように処理しますか?

分類Dev

停止する方法-コマンドラインパラメータで処理しますか?

分類Dev

私はubuntuに何かをインストールするのに問題があります:処理中にエラーが発生しました:kexi

分類Dev

データベース処理の問題 - Perl でパッケージをローカライズする方法はありますか?

分類Dev

異なるパラメータで.htaccessリダイレクトを処理しますか?

Related 関連記事

  1. 1

    非同期ライブラリには、パイプラインを処理するための制御フローがありますか?

  2. 2

    Android Gradleプラグインは、ライブラリ内の競合するリソースをどのように処理しますか?

  3. 3

    ファクトリデザインパターンで長さが異なるコンストラクタをどのように処理しますか?

  4. 4

    プロセスの未処理の例外ハンドラーを無効にできますか?

  5. 5

    既存の実行中のパイプラインを再デプロイすると、Readyタイムスライスが再度処理されますか?

  6. 6

    Springのカスタム例外ハンドラーの内部からスローされた例外を処理する方法はありますか?

  7. 7

    未処理の例外ハンドラーを使用すると、例外ディスパッチはどのように変化しますか?

  8. 8

    RESTful API からのライブ データを処理する

  9. 9

    getMessage()からのメッセージに関する例外を処理します

  10. 10

    Lombok Builderは、例外をスローする可能性のあるコンストラクターを処理できますか?

  11. 11

    リポジトリレイヤーでスローされた例外を処理するための汎用のSpring-dataExceptionクラスはありますか?

  12. 12

    ASP.NET Web API 2で*すべて*の例外処理を無効にしますか(自分用のスペースを確保するため)?

  13. 13

    親クラスの例外をスローすると、サブクラスの例外がキャッチ/処理されても、そのサブクラスの例外イベントがスローされますか?

  14. 14

    Yii2:致命的なエラーにのみエラーハンドラーを使用するか、処理されるエラータイプを指定します

  15. 15

    遅いIOを処理しない場合、パフォーマンスの観点からリアクティブプログラミングを使用することは理にかなっていますか?

  16. 16

    Python 2の例外内でエラーを処理しますか?

  17. 17

    未処理の例外をvb.netクラスライブラリプロジェクトに記録するにはどうすればよいですか?

  18. 18

    マイクロサービスのスケーリング中にRedisサブスクライブします。そのうちの1つだけにリクエストを処理させるにはどうすればよいですか?

  19. 19

    Visual Studioが、サードパーティのライブラリでスローおよび処理された例外で中断するのはなぜですか?

  20. 20

    重大なエラー処理のために、非同期ベースのライブラリはどのAPIを提供する必要がありますか?

  21. 21

    ldは、(ソースファイルとライブラリで)2回提供されるコードをどのように処理しますか?

  22. 22

    アプリケーションランタイムで権限の取り消しをどのように処理する必要がありますか?

  23. 23

    タイムライブラリの例外を処理する方法は?

  24. 24

    Wi-FiルーターはクライアントのDHCPを処理する必要がありますか?

  25. 25

    宣言型パイプラインでグローバル変数をどのように処理しますか?

  26. 26

    停止する方法-コマンドラインパラメータで処理しますか?

  27. 27

    私はubuntuに何かをインストールするのに問題があります:処理中にエラーが発生しました:kexi

  28. 28

    データベース処理の問題 - Perl でパッケージをローカライズする方法はありますか?

  29. 29

    異なるパラメータで.htaccessリダイレクトを処理しますか?

ホットタグ

アーカイブ