私はMVCEF5セットアップを持っており、クラスは次のとおりです。
Program
-これはコントローラーですUserInterface
-これはビューであり、データの表示とプロンプトを表示します。DataAccess
-モデル、これは私のEFモデルクラスのデータを作成、読み取り、更新、および削除します
DataAccessクラスがデータベースでCRUD操作を実行しようとしたときに、エラーが発生した場合はそれを処理する必要があります。UserInterfaceクラスはユーザーにメッセージを出力し、必要に応じてエラーを報告する必要があります。したがって、エラーが発生した場合、データ層はプレゼンテーション層と直接通信するべきではないため、最初にプログラムクラスを通過し、次にUserInterfaceクラスを通過する必要があります。
呼び出し元の関数に例外を渡したり返したりしないことを提案されましたが、「上のレイヤーに新しい単純な例外をスローする」必要があります。例外に関する私の経験は次の形式に限定されているため、例外に関するこのすべての話は私を混乱させます。
try
{
// stuff
}
catch (exception ex)
{
console.writeline(ex.ToString());
}
私はこの問題の答えを見つけるために自分自身の調査をいくつか行いました。いくつかのことを学びましたが、すべてをまとめる方法がわかりません。
私は学んだ:
throw;
例外を再スローし、スタックトレースを保持しますthrow ex
キャッチブロックでキャッチされたものなど、既存の例外をスローします。スタックトレースをリセットします。- Exception.StackTraceというプロパティがあります。例外がスローされるたびに、呼び出しスタックのフレームがException.StackTraceプロパティに記録されることを理解しています。
ただし、再スローを利用するためにtry/catchブロックをどこに配置するかわかりません
次のコードのようなものですか?それとも、これがどのように機能するかについてのポイントを逃していますか?
編集:(他の人にこの当て推量を理解するためにもう少し追加)
void MethodA()
{
try
{
MethodB();
}
catch (MyExceptionType ex)
{
// Do stuff appropriate for MyExceptionType
throw;
}
}
void MethodB()
{
try
{
MethodC();
}
catch (AnotherExceptionType ex)
{
// Do stuff appropriate for AnotherExceptionType
throw;
}
}
void MethodC()
{
try
{
// Do Stuff
}
catch (YetAnotherExceptionType ex)
{
// Do stuff appropriate for YetAnotherExceptionType
throw;
}
}