2017-07-28 23 views
0

私は誰かが何が起こっているのか説明できることを願っています。コントローラーのアクションが例外をキャッチしていません

"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"クラス内の他の関数がコントローラの中にスローされるという例外をキャッチする必要があります。

ご協力いただければ幸いです。

+0

を返す必要があります。重複する値を挿入しようとしていないことを確認するために、いくつか余分なチェックを行うだけで済みます。値が存在する場合は、何かを返して、どこでもエラーを投げるのではなく、うまく処理してください。例外を投げることに関連するコストがあります。 –

+0

私はそれを行うことができますが、何らかの例外を捕まえる準備が必要です。どれだけのバリデーションを行っても、私のコードは例外がスローされるのを捕まえる準備ができていなければなりません。 –

答えて

2

Insertメソッドを使用しているわけではありません。そのため、アクションで例外をキャッチすることはできません。 Visual Studioでは、そのメソッドで待っていることが何もないという警告メッセージが表示されます。これにあなたのコードを変更します。

await this.invoices.Insert(invoice); 

また、あなたのリポジトリがasync voidを使用してはならない、これは正直に言うと、そのようなエラーに対処するための非常に悪い方法ですTask

+0

あなたは関係のない質問に答えています...これはなぜ「非同期voidからの例外が捕捉されないのか」... –

+0

どうして無関係ですか? – DavidG

+0

私は "await"を追加しましたが、それはエラーをマークするために使用されました。あなたが私に言ったように、私は "タスク"へのリターンを変更し、 "待っている"エラーはもはやマークされていません。できます。ありがとう。 –

関連する問題