为什么2个Try/Catch块会冻结应用程序?

Nul*_*ark 2 .net vb.net try-catch winforms

我正在编写一个简单的应用程序,它将来自2个文本框的输入作为分子和分母,然后将它们传递给Reduce()方法.

我需要将文本框字符串转换为整数,但如果用户不小心键入非数字键,我不希望它停止程序,所以我将赋值放在Try ... Catch语句中以防止从发生.

但是,当我在2个文本框中键入字母并按下按钮时,窗口就会冻结并且全部搞乱.谁能解释一下发生了什么?

这是我的代码:

Private Sub btnReduce_Click(ByVal sender As Object, 
          ByVal e As EventArgs) Handles btnReduce.Click
    Dim n As Integer
    Dim d As Integer
    Try
        n = Val(txtNum.Text)
    Catch ex As Exception
        MsgBox("Please enter a numeric numerator", , "ERROR")
        Exit Sub
    End Try
    Try
        d = Val(txtDenom.Text)
    Catch ex As Exception
        MsgBox("Please enter a numeric denominator", , "ERROR")
        Exit Sub
    End Try
    Reduce(n, d)
    Dim reduced As String = n.ToString + "/" + d.ToString
    lblDisplay.Text = "The reduced fraction is " + reduced
End Sub
Run Code Online (Sandbox Code Playgroud)

Ňɏs*_*arp 6

而不是一个Try/CatchVal使用Integer.TryParse(或其他类型).问题是Val如果不好就不会抛出异常.它将返回任何前导数字的值:

n = Val("abc")          ' == 0.0
n = Val("1a2b3c")       ' == 1.0
Run Code Online (Sandbox Code Playgroud)

它也总是返回一个Double,所以如下:

Dim n As Integer
n = Val(txtNum.Text) 
Run Code Online (Sandbox Code Playgroud)

...是无效代码Option Strict- 您正在尝试将Double分配给整数.

Dim n As Integer
Dim d As Integer

' if it can parse a value, it will be stored in n
If Integer.TryParse(txtNum.Text, n) = False Then
    MsgBox("Please enter a numeric numerator", , "ERROR")
    Exit Sub
End If

If Integer.TryParse(txtDenom.Text, d) = False Then
    MsgBox("Please enter a numeric numerator", , "ERROR")
    Exit Sub
End If

Reduce(n, d)
...
Run Code Online (Sandbox Code Playgroud)

其中一个好处*.TryParse()是它可以通过返回a 来避免异常Boolean.例外不适用于流控制或数据验证,这是您的代码尝试使用它们的方式.

一般来说,最好避免使用那些遗留的VB函数Val,Mid而不是那些通常更强大,更灵活,更好键入的.NET对应函数.

此外,打开Option Strict- 它会将许多运行时错误和怪异的错误转换为编译器错误,指出行/问题.例如,它可能实际上并没有停留在该方法中,而是稍后在某处使用错误值时.