2016-12-08 5 views
1

Я понимаю, что мой заголовок не очень информативен и, на мой взгляд, довольно сложно словом. В Visual Basic я пытаюсь запустить кусок кода, если код перед тем, как он передает оператор try, но не запускает его, если он не передает инструкцию try.Как запустить код, если код перед его прохождением инструкции try

Мой код выглядит следующим образом:

Public Class Form2 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim newCustomersRow As DataRow = Form1.Book_StoreDataSet.Customer.NewRow() 
     newCustomersRow("Title") = TextBox1.Text() 
     newCustomersRow("First Name") = TextBox2.Text() 
     newCustomersRow("Last Name") = TextBox3.Text() 
     newCustomersRow("Address Line 1") = TextBox4.Text() 
     newCustomersRow("Town") = TextBox5.Text() 
     newCustomersRow("County") = TextBox6.Text() 
     newCustomersRow("Post Code") = TextBox7.Text() 
     newCustomersRow("Card Type") = TextBox8.Text() 
     newCustomersRow("Card Number") = TextBox9.Text() 
     Try 
      newCustomersRow("Expiry Date") = TextBox10.Text() 
     Catch ex As ArgumentException 
      MsgBox("Please enter date like this: DD/MM/YY.") 
      TextBox1.Text = "" 
      TextBox2.Text = "" 
      TextBox3.Text = "" 
      TextBox4.Text = "" 
      TextBox5.Text = "" 
      TextBox6.Text = "" 
      TextBox7.Text = "" 
      TextBox8.Text = "" 
      TextBox9.Text = "" 
      TextBox10.Text = "" 
     End Try 
     Try 
      Form1.Book_StoreDataSet.Customer.Rows.Add(newCustomersRow) 
      MsgBox("Data added successfully") 
      TextBox1.Text = "" 
      TextBox2.Text = "" 
      TextBox3.Text = "" 
      TextBox4.Text = "" 
      TextBox5.Text = "" 
      TextBox6.Text = "" 
      TextBox7.Text = "" 
      TextBox8.Text = "" 
      TextBox9.Text = "" 
      TextBox10.Text = "" 
     Catch a As ConstraintException 
      MsgBox("That Card Number already exists.") 
     End Try 
    End Sub 
End Class 

Каждый раз, когда он работает он говорит «успешно добавлен Data», даже если есть ошибка.

+0

Это цель Try/Catch. Он позволяет обрабатывать ошибку и продолжать работу без ошибки, прекращающей вашу обработку. Переместите второй Try/Catch до внутри первой. Попробуйте получить желаемый эффект. –

+0

Спасибо, что решили проблему. По иронии судьбы я пробовал это так же, как вы отправили свой ответ. В любом случае, спасибо за вашу помощь :) – IsaSca

+0

@ IsaSca: Я не являюсь поклонником этого варианта, см. Мой ответ для деталей. – Heinzi

ответ

1

Итак, в двух словах, то есть следующая проблема:

Try 
    A 
Catch SomeExceptionThrownByA 
    B 
End Try 

C? ' only run this if there was no exception before 

правильно?


Существует несколько способов решить эту проблему. Так как в вашем случае, вы хотите, чтобы пропустить все следующий код, самый простой из них будет:

Вариант 1

Try 
    A 
Catch SomeExceptionThrownByA 
    B 
    Return 
End Try 

C 

Альтернативы будет:

Вариант 2

Try 
    A 
    C 
Catch SomeExceptionThrownByA 
    B 
End Try 

или

Вариант 3

Dim success = False 
Try 
    A 
    success = True 
Catch SomeExceptionThrownByA 
    B 
End Try 

If success Then 
    C 
End If 

Лично я бы предпочел вариант 1, если это возможно, и вариант 3 в противном случае, так как он держит Try-Catch блок коротким. Я не очень нравится вариант 2, так как

  • делает его менее очевидно, что Catch блок должен отлавливать ошибки в блоке A (вместо блока C) и
  • вещи усложниться, если C может также бросить SomeExceptionThrownByA.
0

Вы можете вставить Try/Catch go, чтобы получить желаемый результат.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim newCustomersRow As DataRow = Form1.Book_StoreDataSet.Customer.NewRow() 
    newCustomersRow("Title") = TextBox1.Text() 
    newCustomersRow("First Name") = TextBox2.Text() 
    newCustomersRow("Last Name") = TextBox3.Text() 
    newCustomersRow("Address Line 1") = TextBox4.Text() 
    newCustomersRow("Town") = TextBox5.Text() 
    newCustomersRow("County") = TextBox6.Text() 
    newCustomersRow("Post Code") = TextBox7.Text() 
    newCustomersRow("Card Type") = TextBox8.Text() 
    newCustomersRow("Card Number") = TextBox9.Text() 
    Try 
     newCustomersRow("Expiry Date") = TextBox10.Text() 
     Try 
      Form1.Book_StoreDataSet.Customer.Rows.Add(newCustomersRow) 
      MsgBox("Data added successfully") 
      TextBox1.Text = "" 
      TextBox2.Text = "" 
      TextBox3.Text = "" 
      TextBox4.Text = "" 
      TextBox5.Text = "" 
      TextBox6.Text = "" 
      TextBox7.Text = "" 
      TextBox8.Text = "" 
      TextBox9.Text = "" 
      TextBox10.Text = "" 
     Catch a As ConstraintException 
      MsgBox("That Card Number already exists.") 
     End Try 

    Catch ex As ArgumentException 
     MsgBox("Please enter date like this: DD/MM/YY.") 
     TextBox1.Text = "" 
     TextBox2.Text = "" 
     TextBox3.Text = "" 
     TextBox4.Text = "" 
     TextBox5.Text = "" 
     TextBox6.Text = "" 
     TextBox7.Text = "" 
     TextBox8.Text = "" 
     TextBox9.Text = "" 
     TextBox10.Text = "" 
    End Try 

End Sub 
End Class 
1

На мой взгляд, вам лучше обслуживать, вытаскивая валидацию в другой метод.

Так (простите синтаксис, мой VB было время):

Private Sub Button1_Click(sender As Object, e As EventArgs)  
    var isValid = ValidateData() 
    if (!isValid) then 
     MessageBox.... 
     return 
    end if 
    try 
     Form1.Book_StoreDataSet.Customer.Rows.Add(newCustomersRow) 
     .... 
    catch 
    ... 

Поэтому я говорю, это то, что происходит, когда вы хотите или должны подтвердить другие данные? Отделив проверку, вы даете себе большую гибкость и очищаете свой код.

+0

Спасибо за ваш ответ, я скоро проверил это – IsaSca

+0

. Это лучший ответ. Не используйте обработку исключений с обработкой проверки. –

0

Мне кажется, что использование Try..Catch..End Try для проверки данных не является идеальным.Конечно, лучше было бы использовать Date.TryParse вместо кода ниже и использовать If .. End If, чтобы проверить, существует ли объект в вашем наборе данных?

Если честно, использование этого метода для улавливания неправильно введенной даты является ошибочным. Если кто-то попытался войти 8 июня 2016 года как 08/06/2016, он не был бы пойман вашим тестом на валидность. лучше было бы использовать DateTimePicker.

If Not Date.TryParse(TextBox10.Text, newCustomersRow("Expiry Date")) Then 
     MsgBox("Please enter date like this: DD/MM/YY.") 
     TextBox1.Text = "" 
     TextBox2.Text = "" 
     TextBox3.Text = "" 
     TextBox4.Text = "" 
     TextBox5.Text = "" 
     TextBox6.Text = "" 
     TextBox7.Text = "" 
     TextBox8.Text = "" 
     TextBox9.Text = "" 
     TextBox10.Text = "" 
    Else 
     Try 
      Form1.Book_StoreDataSet.Customer.Rows.Add(newCustomersRow) 
      MsgBox("Data added successfully") 
      TextBox1.Text = "" 
      TextBox2.Text = "" 
      TextBox3.Text = "" 
      TextBox4.Text = "" 
      TextBox5.Text = "" 
      TextBox6.Text = "" 
      TextBox7.Text = "" 
      TextBox8.Text = "" 
      TextBox9.Text = "" 
      TextBox10.Text = "" 
     Catch a As ConstraintException 
      MsgBox("That Card Number already exists.") 
     End Try 
    End If 
Смежные вопросы