私は誰かが何が起こっているのか説明できることを願っています。コントローラーのアクションが例外をキャッチしていません
"Invoice.cs"というオブジェクトのリスト、挿入、更新、削除などのすべてのロジックを管理するリポジトリクラス "InvoicesRepository.cs"を作成しました。よりクリーンでメンテナンスが簡単です。
public class InvoicesRepository
{
protected MySQLContext db;
public InvoicesRepository(MySQLContext db)
{
this.db = db;
}
public async void Insert(Invoice obj)
{
this.db.Invoices.Add(obj);
await this.db.SaveChangesAsync();
// performing other tasks...
}
// other useful methods...
}
「InvoicesController.cs」には、必要なすべての操作があります。このコントローラの中で私は "InvoiceTepository" objを作成し、それを使って情報をデータベースに保存します。そして、テストのために
public class InvoicesController : Controller
{
private InvoicesRepository invoices;
public InvoicesController()
{
this.invoices = new InvoicesRepository(new MySQLContext());
}
[HttpPost]
public async Task<ActionResult> Upload(Invoice invoice)
{
try
{
this.invoices.Insert(invoice);
}
catch (DbEntityValidationException ex)
{
foreach (var eve in ex.EntityValidationErrors)
{
foreach (var err in eve.ValidationErrors)
{
ModelState.AddModelError(err.PropertyName, err.ErrorMessage);
}
}
}
catch (System.Data.Entity.Infrastructure.DbUpdateException ex)
{
ModelState.AddModelError("", ex.ToString());
}
catch (System.Data.Entity.Core.UpdateException ex)
{
ModelState.AddModelError("", ex.ToString());
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
ModelState.AddModelError("", ex.ToString());
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.ToString());
}
return View();
}
// other useful action methods...
}
すべてのアクションで、私は例外をスローして、自分の行動がそれをキャッチし、適切に表示するために期待して、データベース内の重複データを持っている「請求書」オブジェクト(一意の列)を挿入していますビュー内のエラーですが、例外は「スローされますが、キャッチされません」。
私はどのような種類の例外(内部例外を含む)がスローされ、必要な "キャッチ"が追加されたかを確認するためにデバッグしましたが、例外は "キャッチされません"。
私は例外が「catched」である情報を保存するために、直接「MySQLContext.cs」クラスを使用するには、コントローラのコードを変更した場合:
[HttpPost]
public async Task<ActionResult> Upload(Invoice invoice)
{
try
{
// this is "catched" ¿?
this.db.Invoices.Add(obj);
await this.db.SaveChangesAsync();
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.ToString());
}
return View();
}
ですが、なぜでしょうか?私は私の "挿入"または "InvoiceRepository"クラス内の他の関数がコントローラの中にスローされるという例外をキャッチする必要があります。
ご協力いただければ幸いです。
を返す必要があります。重複する値を挿入しようとしていないことを確認するために、いくつか余分なチェックを行うだけで済みます。値が存在する場合は、何かを返して、どこでもエラーを投げるのではなく、うまく処理してください。例外を投げることに関連するコストがあります。 –
私はそれを行うことができますが、何らかの例外を捕まえる準備が必要です。どれだけのバリデーションを行っても、私のコードは例外がスローされるのを捕まえる準備ができていなければなりません。 –