Visual Basic: проблемы с обработкой исключений TRY\CATCH

Я работаю над базой данных сотрудников, и у меня возникают проблемы с TRY\CATCH для сохранения записей, поскольку это относится к обработке исключений. Проблема, с которой я сталкиваюсь, заключается в том, что он запускает TRY и игнорирует CATCH, позволяя передавать неверные данные и сохранять их в файл. Я очень новичок в Visual Basic и не знаю, почему это не работает. Вот мой код для формы:

Option Strict Off
Imports System.IO

Public Class frmEmployeeData
'Variable Declarations
Dim BlnisChanged As Boolean = False
Dim empFirstName As String
Dim empMiddleName As String
Dim empLastName As String
Dim empNumber As Integer
Dim empDepartment As String
Dim empTelephone As String
Dim empExtension As Integer
Dim empEmailAddress As String
Dim empSelection As String
Dim fileName As String
Dim intTryParse As Integer = 0



Private Sub frmEmployeeData_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Adds the department options to the combo box dropdown list
    ComboBoxEmpDepartment.Items.Add("Accounting")
    ComboBoxEmpDepartment.Items.Add("Administration")
    ComboBoxEmpDepartment.Items.Add("Marketing")
    ComboBoxEmpDepartment.Items.Add("MIS")
    ComboBoxEmpDepartment.Items.Add("Sales")
End Sub

Sub ClearItems()
    'Clears text boxes
    txtFirstName.Clear()
    txtMiddleName.Clear()
    txtLastName.Clear()
    txtEmployeeNumber.Clear()
    ComboBoxEmpDepartment.ResetText()
    txtTelephone.Clear()
    txtExtension.Clear()
    txtEmailAddress.Clear()
End Sub

Sub SaveItems()
    Dim savedEmployeeFile As StreamWriter

    Try
        'Creates the employee file
        savedEmployeeFile = File.CreateText(fileName)

        'writes information entered by user into file
        savedEmployeeFile.WriteLine(txtFirstName.Text)
        savedEmployeeFile.WriteLine(txtMiddleName.Text)
        savedEmployeeFile.WriteLine(txtLastName.Text)
        savedEmployeeFile.WriteLine(txtEmployeeNumber.Text)
        savedEmployeeFile.WriteLine(ComboBoxEmpDepartment.Text)
        savedEmployeeFile.WriteLine(txtTelephone.Text)
        savedEmployeeFile.WriteLine(txtExtension.Text)
        savedEmployeeFile.WriteLine(txtEmailAddress.Text)

        'Closes the file
        savedEmployeeFile.Close()

        BlnisChanged = False

        'Clears the text boxes
        ClearItems()

    Catch ex As Exception
        'Throws error if file could Not be created
        MessageBox.Show("Unable To Create File. Please Try Again", "Error In Saving")

    End Try
End Sub
Sub AppendToFile()
    Dim savedEmployeeFile As StreamWriter

    Try
        'append to file
        savedEmployeeFile = File.AppendText(fileName)

        'writes information entered by user into file
        savedEmployeeFile.WriteLine(txtFirstName.Text)
        savedEmployeeFile.WriteLine(txtMiddleName.Text)
        savedEmployeeFile.WriteLine(txtLastName.Text)
        savedEmployeeFile.WriteLine(txtEmployeeNumber.Text)
        savedEmployeeFile.WriteLine(ComboBoxEmpDepartment.Text)
        savedEmployeeFile.WriteLine(txtTelephone.Text)
        savedEmployeeFile.WriteLine(txtExtension.Text)
        savedEmployeeFile.WriteLine(txtEmailAddress.Text)

        MessageBox.Show("Employee saved successfully.", "Success")

        'Closes the file
        savedEmployeeFile.Close()


        BlnisChanged = False

        'Clears the text boxes
        ClearItems()
    Catch ex As Exception
        MessageBox.Show("No file exists. Please select 'Save As' Option.", "Error In Saving")
    End Try
End Sub

Private Sub btnSaveRecord_Click(sender As Object, e As EventArgs) Handles btnSaveRecord.Click
    Dim savedEmployeeFile As StreamWriter

    'EXCEPTION HANDLING
    'verifies first name field content
    If txtFirstName.Text = "" Then
        MessageBox.Show("First name cannot be blank", "Invalid Entry")
    End If
    'verifies middle name field content
    If txtMiddleName.Text = "" Then
        MessageBox.Show("Middle name cannot be blank", "Invalid Entry")
    End If
    'verifies last name field content
    If txtLastName.Text = "" Then
        MessageBox.Show("Last name cannot be blank", "Invalid Entry")
    End If
    'verifies employee number field content
    If txtEmployeeNumber.Text = "" Then
        MessageBox.Show("Employee number cannot be blank", "Invalid Entry")
    ElseIf Not (Integer.TryParse(txtEmployeeNumber.Text, intTryParse)) Then
        MessageBox.Show("Employee number must be numeric", "Invalid Entry")
    ElseIf CStr(txtEmployeeNumber.Text) < 0 Then
        MessageBox.Show("Employee number must be positive", "Invalid Entry")
    End If
    'verifies department field content
    If ComboBoxEmpDepartment.Text = "" Then
        MessageBox.Show("Employee department cannot be blank", "Invalid Entry")
    End If
    'verifies telephone number field content
    If txtTelephone.Text = "" Then
        MessageBox.Show("Telephone number cannot be blank", "Invalid Entry")
    ElseIf Not (Integer.TryParse(txtEmployeeNumber.Text, intTryParse)) Then
        MessageBox.Show("Telephone number must be numeric", "Invalid Entry")
    End If
    'verifies extension field content
    If txtExtension.Text = "" Then
        MessageBox.Show("Extension cannot be blank", "Invalid Entry")
    ElseIf Not (Integer.TryParse(txtExtension.Text, intTryParse)) Then
        MessageBox.Show("Extension must be numeric", "Invalid Entry")
    ElseIf CInt(txtExtension.Text) < 0 Then
        MessageBox.Show("Extension must be positive", "Invalid Entry")
    End If
    'verifies email address field content
    If txtEmailAddress.Text = "" Then
        MessageBox.Show("Email Address cannot be blank", "Invalid Entry")
    End If


    'If no filename exists, will prompt save dialog box and prompt user to save as
    If fileName = String.Empty Then
        If sfdSave.ShowDialog = System.Windows.Forms.DialogResult.OK Then
            fileName = sfdSave.FileName
            SaveItems()
        End If

        'If filename exists, append item to file
    Else
        AppendToFile()
    End If
End Sub

Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
    'Clears all content currently within text boxes
    txtFirstName.Clear()
    txtMiddleName.Clear()
    txtLastName.Clear()
    txtEmployeeNumber.Clear()
    ComboBoxEmpDepartment.ResetText()
    txtTelephone.Clear()
    txtExtension.Clear()
    txtEmailAddress.Clear()

End Sub

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    'Closes Program
    frmUserSelection.Show()
    Me.Visible = False
End Sub

Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles sfdSave.FileOk

End Sub

Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    'Picture Obtained From:
    '"User Add Icon-Shine Set: Add New User, Add User." Free Icons PNG. Accessed 14 October 2018. https://www.freeiconspng.com/img/2487
End Sub
End Class

person user7217915    schedule 18.10.2018    source источник
comment
Включите Option Strict снова. Это самое первое, что вы должны сделать. Затем исправьте все ошибки компилятора, которые вы увидите в результате.   -  person Joel Coehoorn    schedule 18.10.2018
comment
Вместо текстового файла, который вы записываете вручную, изучите сериализацию.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 19.10.2018


Ответы (1)


Блок Catch выполняется только в том случае, если внутри блока Try возникает исключение. Я не вижу здесь ничего, что могло бы привести к этому. Похоже, вы немного неправильно понимаете это.

Не помещайте логику валидации в блок Catch. Все, что нужно сделать, это код для обработки исключения, если оно возникнет. Например, при сбое подключения к базе данных из-за того, что сама база данных находится в автономном режиме, или при сбое записи в файл из-за того, что файл не может быть найден/открыт.

Поместите свою логику валидации еще до того, как попытаетесь ее сохранить. Если пользовательский ввод не прошел проверку, не пытайтесь его сохранить. Вместо этого вернуть пользователю ошибку. Только если ваша пользовательская проверка пройдена, вы можете начать Try, записать в свое хранилище данных и обработать исключение, если оно возникнет.

person David    schedule 18.10.2018
comment
Спасибо, Дэвид. Думаю, я не уверен, куда бы я поместил это в свой код для проверки, когда пользователь вводит информацию. - person user7217915; 18.10.2018
comment
@ user7217915: Всякий раз, когда вы хотите проверить ввод пользователя. Например, если у вас есть кнопка, которую пользователь нажимает для сохранения своих данных, первое, что должен сделать обработчик кликов, — это проверить этот ввод. - person David; 18.10.2018
comment
Спасибо тебе за пояснение. Я добавил его в раздел btnSave, и сейчас он проверяется, но по-прежнему сохраняет, а не заставляет их вводить информацию (я повторно обновлю свой код - person user7217915; 18.10.2018
comment
@ user7217915: Похоже, вы уведомляете пользователя об ошибке проверки, но все равно не предотвращаете сохранение. Рассмотрите возможность сохранения значения Boolean в вашей функции. Что-то вроде isValid. Первоначально установите его на True, но в любой из ваших проверок установите его на False. После всех проверок, если значение равно False, то хотя бы одна из них не удалась. Выполняйте сохранение, только если это значение равно True. - person David; 18.10.2018
comment
Большое спасибо за вашу помощь в этом! Я сделал это, и теперь он работает как шарм :) Я не могу передать вам, насколько я ценю вашу помощь, так как я безрезультатно занимался этим часами. - person user7217915; 18.10.2018
comment
будет ли способ проверить каждое поле в реальном времени по мере его ввода и перехода пользователя к следующему полю? Когда я сохраняю, он отображает несколько всплывающих окон. Просто любопытно, если и как я мог бы сделать это. - person user7217915; 19.10.2018
comment
@user7217915 user7217915 Поддерживается проверка в реальном времени. Какую библиотеку вы используете для своих форм? - person Craig; 19.10.2018