私は今まで書いてきたすべてのバグのコードに疲れているので、例外を扱う正しいアプローチを理解する必要があるようです。私は投げられる/投げられるべきものは何ですか?
のは、次の例について考えてみましょう:私はREADDATA()が何らかの理由で失敗した場合にキャッチすることを期待することができます例外は何ですか、私はあるIDataSourceを実装するクラスのオブジェクトを使用している場合は
interface IDataSource
{
string ReadData(int offset);
}
class FileDataSource : IDataSource {...}
class DatabaseDataSource : IDataSource {...}
を?
FileDataSourceは、ファイルが存在しないか、ファイルがオフセットよりも小さいために失敗することがあります。 DatabaseDataSourceは、データベースに接続できないか、そのデータベースに必要なテーブルがないため、失敗する可能性があります。
私はこれを実行します。
var data = dataSource.ReadData(10);
私は何をキャッチする必要がありますか?反対側から、新しいクラスFakeDataSource
を実装している場合、何か悪いことが起きたらどうすればいいですか?
私はDatabaseDataSource
からFileDataSource
またはSqlException
からFileNotFoundException
を投げるとき、私は実装の詳細を知っているので、それは、カプセル化違反を意味することを感じています。
IDataSource
によってスローされたすべての例外をこのインタフェースにバインドする必要がありますか?つまり、新しい抽象を定義するときに、関連する例外も定義する必要があります。このように:誰かがIDataSource
を実装することを決定したときに
interface IDataSource { ... }
abstract class DataSourceException : Exception { ... }
そう、彼は唯一のDataSourceException
秒をスローする必要があります。あれは正しいですか? offset
の値が間違っているのはなぜですかDataSourceException
または標準(.NET)ArgumentOutOfRangeException
はOKですか?
エラー処理についての記事へのリンクもありがたいと思います。