2016-08-03 2 views
0

사용자 콘트롤이있는 메인 윈도우 폼이 있습니다. 거기서 나는 데이터베이스와 관련된 몇 가지 작업을 수행합니다. 데이터베이스 프로세스 중 나는 사용자에게 추가 윈도우 폼을 보여주기 때문에 좋은 서커스 그래픽을 볼 수있다. 내가 언급 된 데이터베이스 프로세스를 배치하는 작업을 사용하고 거기에서 오류가 발생하면 try/catch에서 오류 메시지를 표시하려고합니다. Unfortunetly MessageBox.Show가 테스트를 수행 할 때 표시되지 않습니다. catch에 도달하지도 않았습니다. 무엇이 잘못되었는지 좀 도와 주실 수 있습니까? 나는 캐치 한 Statment에서이 라인에 대해 이야기하고있다 :오류 발생시 캐치가 발생하지 않음

Dim createArticle As New Artikel 

        Dim pic As New FrmCircularProgress(eCircularProgressType.Donut) 
        Dim tsk As Task(Of Boolean) = Task.Factory.StartNew(Of Boolean)(Function() 
                         '--Run lenghty task 
                         Dim resu = False 
                         Try 
                          resu = createArticle.ProcessArticle(_artikelsAndTheirVariationsFinal) 
                          '--Close form once done (on GUI thread) 

                         Catch sqlex As Exception 
                          pic.Invoke(Sub() MessageBox.Show(pic, sqlex.Message)) 
                                              Finally 
                          pic.Invoke(New Action(Sub() pic.StopCircular())) 
                          pic.Invoke(New Action(Sub() pic.Close())) 
                         End Try 

                         Return resu 
                        End Function) 

        '--Show the form 
        pic.ShowDialog() 
        Task.WaitAll(tsk) 
... 

그리고 단지에 대한이 : 내가 작업과 함께 사용하는 방법

Public Class FrmCircularProgress 
    Sub New(progressType As DevComponents.DotNetBar.eCircularProgressType) 
     InitializeComponent() 
     CircularProgress1.ProgressBarType = progressType 
     StartCircular() 
    End Sub 

    Public Sub StartCircular() 
     Me.CircularProgress1.IsRunning = True 
    End Sub 

    Public Sub StopCircular() 
     Me.CircularProgress1.IsRunning = False 
    End Sub 
End Class 

이 예는 다음과 같습니다

Catch sqlex As Exception 
pic.Invoke(Sub() MessageBox.Show(pic, sqlex.Message)) 

여기 circural 윈도우의 형태 코드입니다 우리는 예제 데이터베이스 프로세스를 볼 수 있습니다. 사실 또는 거짓을 반환하는 ProcessArticle

Public Function ProcessArticle(artikel As ArticlesVariations) As Boolean 

     Dim result = True 
     Dim strcon = New AppSettingsReader().GetValue("ConnectionString", GetType(System.String)).ToString() 

     Using connection As New SqlConnection(strcon) 
      '-- Open generall connection for all the queries 
      connection.Open() 
      '-- Make the transaction. 
      Dim transaction As SqlTransaction 
      transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted) 

      Dim newArticleRowId As Integer = 0 
      Dim articleIndex As Integer = 0 
      Try 
       For Each kvp As KeyValuePair(Of Integer, Artikel) In artikel.collection 
        Dim ckey As Integer = kvp.Key 
        articleIndex = kvp.Key    'save article key 
        Dim data As Artikel = kvp.Value 

        '-- If given article contains images list (artikel_images is a list with pictures associated with article) 
        If Not IsNothing(artikel.collection(articleIndex).ArtikelImages) Then 
         For Each img In artikel.collection(articleIndex).ArtikelImages 
          '--Insert article's images if exists 
          Using cmd As New SqlCommand("INSERT INTO T_Article_Image (Path, FK_Artikel_ID, Position) VALUES (@Path, @FK_Artikel_ID, @Position)", connection) 
           cmd.CommandType = CommandType.Text 
           cmd.Connection = connection 
           cmd.Transaction = transaction 
           cmd.Parameters.AddWithValue("@Path", img.Path) 
           cmd.Parameters.AddWithValue("@FK_Artikel_ID", newArticleRowId) 
           cmd.Parameters.AddWithValue("@Position", img.Position) 
           cmd.ExecuteScalar() 
          End Using 
         Next 
        End If 

        '-- If given article contains articles variations list (artikel_variation_attributes is a list with variations associated with article) 
        If Not IsNothing(artikel.collection(articleIndex)._artikel_variation_attributes) Then 
         For Each var In artikel.collection(articleIndex)._artikel_variation_attributes 

          '--Insert article's images if exists 
          Using cmd As New SqlCommand("INSERT INTO T_Artikel_T_Variation (FK_Variation_VariationAttribute_ID, FK_Artikel_ID, Position) VALUES (@FK_Variation_VariationAttribute_ID, @FK_Artikel_ID, @Position)", connection) 
           cmd.CommandType = CommandType.Text 
           cmd.Connection = connection 
           cmd.Transaction = transaction 
           cmd.Parameters.AddWithValue("@FK_Variation_VariationAttribute_ID", New Variation_VariationAttribute(var.FkVariationId, var.FkVariationAttributeId).GetId()) 
           cmd.Parameters.AddWithValue("@FK_Artikel_ID", newArticleRowId) 
           cmd.Parameters.AddWithValue("@Position", var.Position) 
           cmd.ExecuteScalar() 
          End Using 
         Next 
        End If 

       Next 
       transaction.Commit() 
      Catch ex As Exception 
       result = False 
       '-- Roll the transaction back. 
       Try 
        transaction.Rollback() 
       Catch ex2 As Exception 
result = False 
       End Try 

      End Try 
     End Using 

     Return result 
    End Function 
+2

간결하고 재현 가능한 예제를 만들 수 있습니까? 데이터베이스에 대한 참조를 제거하고, 항상 예외를 던져 버리고 그것을 잡으려고하십시오. 항상 조언을 구하기 전에 문제를 줄이기 위해 노력하십시오. – Neolisk

+0

@ Neolisk 나는 이미 많은 부분을 잘라 냈다. 내 관점에서 보면 꽤 명확하다. –

+0

아내 한테 물어보기가 사람마다 어떻게 다른지 물어보십시오! –

답변

0

캐치에 도달 할 것으로 기대하지 않습니다. 당신의 ProcessArticle 함수에서 또 하나의 try .. Catch SQL 연산에 오류가 있다면, 이것이 잡힐 것이다. 그런 다음 거짓을 반환합니다! 따라서 호출 루틴은 이미 정상적으로 처리되었으므로 오류를 포착하지 않습니다. 호출 루틴에서 오류를 catch하려면 ProcessArticle 함수에서 catch의 오류를 발생시켜야합니다.

는 당신은 내가 VB를 한 이후 약간의 시간

Catch ex As Exception 
     result = False 
     '-- Roll the transaction back. 
     Try 
      transaction.Rollback() 
     Catch ex2 As Exception 
      Throw New Exception("Rollback failed after first exception.", ex2) 
     End Try 
     Throw New Exception("Rollback succeeded after exception.", ex) 
    End Try 

죄송에 ProcessArticle에 시도 캐치를 변경할 수 있습니다,하지만 난 구문이 올바른 생각합니다. 이것을 사용하여, 호출 루틴은 이제 예외를 잡아야합니다 (그리고 내부 예외가있는 예외가 생깁니다). 원인을 찾으려면 내부 예외를 검사해야합니다.

+0

안녕하세요, Jonathan, 당신의 관점에서 당신이 저라면 어떤 방법을 택할 것입니까? 답을 어떻게 수정 하시겠습니까? Thx –

+0

안녕하세요 JimmyJimm입니다. 나는 나의 대답을 편집했다. –

+0

오케이 그래서 나는 그것을 거기에 넣을 것이다. –

관련 문제