这是我到目前为止的代码:
Module Module1
Sub Main()
Dim A, B, C, D As Integer
Do
Try
System.Console.WriteLine("How high is the cube?")
A = Int32.Parse(Console.ReadLine())
Catch leg As System.FormatException
System.Console.WriteLine(leg.Message)
Finally
End Try
Loop Until A =
System.Console.WriteLine("How wide is the cube?")
B = Int32.Parse(Console.ReadLine())
System.Console.WriteLine("How long is the cube?")
C = Int32.Parse(Console.ReadLine())
D = A * B * C
Console.WriteLine(D)
System.Console.ReadKey()
End Sub
End Module
我希望第一个try块循环,直到A是一个Integer,以防用户输入一个字母而不是一个数字。有谁知道我怎么做?
答案 0 :(得分:3)
使用TryParse代替try / catch块和do循环。它成功时返回True,并将int32值放入变量a
。
Dim a As Integer, tmp As String
Do
System.Console.WriteLine("How high is the cube?")
tmp = Console.ReadLine()
Loop While Int32.TryParse(tmp, a) = False
循环后,a
中存储的值将为整数。对每个其他值重复此操作。
你也可以像他在C#样本中做的那样做,而不是费心存储到临时变量中:
Dim a As Integer
Do
System.Console.WriteLine("How high is the cube?")
Loop While Int32.TryParse(Console.ReadLine(), a) = False
如果您必须使用Try / Catch进行作业,您可以尝试这一点,但出于实际目的,我会按上述方式进行。
Dim a As Integer, valid As Boolean = True
Do
Try
System.Console.WriteLine("How high is the cube?")
a = Int32.Parse(Console.ReadLine())
Catch ex As Exception
valid = False
End Try
Loop While Not valid
答案 1 :(得分:0)
在C#中(转换为VB是读者的练习):
public static Int32 GetInt32() {
Int32 value;
while( !Int32.TryParse( Console.ReadLine(), out value ) ) {
Console.WriteLine("Please enter an integer");
}
Console.WriteLine("You entered {0}", value);
return value;
}
答案 2 :(得分:0)
这是一个真实世界的例子,进一步扩展了使用Try / Catch来控制程序流的一个原因。至少在.NET中,抛出错误并在catch中处理它比使用适当的控制流结构正确处理错误需要更多的执行时间。
我从同事那里拿起了一个项目,他正在使用一个函数来清理那些应该是数字的输入。他正在使用类似下面的代码来做这件事。
Public Shared Function SafeDouble(value As Object, Optional DefaultValue As Double = 0.0) As Double
Dim CleanDouble As Double
Try
CleanDouble = CDbl(value) 'try to convert to a double
Catch ex As Exception
CleanDouble = DefaultValue 'if it fails use the default value
End Try
Return CleanDouble
End Function
对于他最初使用它来处理一行数据的地方,它工作得很好。当我开始使用它处理1000行数据时出现了问题。当执行导入的这一部分时,执行陷入困境。
使用一些计时器,我确定它无法转换的每个值需要50到100毫秒,并且会抛出异常。
我更改了代码以使用适当的控制结构,并且每个值无法转换的时间减少到2到5毫秒。目前的代码如下。我知道有些值可能不是数字的。如果它不是数字,我只是立即分配默认值。
Public Shared Function SafeDouble(value As Object, Optional DefaultValue As Double = 0.0) As Double
Dim CleanDouble As Double
Try
If IsNumeric(value) Then 'test to see if the data is numeric before converting it
CleanDouble = CDbl(value)
Else
CleanDouble = DefaultValue 'if it isn't numeric, use default value
End If
Catch ex As Exception
CleanDouble = DefaultValue 'if something unexpected happens, use default value
End Try
Return CleanDouble
End Function
正如您所看到的,我已经处理了它未转换的预期错误,因为它不是数字。这应该是可能发生的大多数问题的原因。我仍然将try / catch留在那里,以防发生其他意外错误。
答案 3 :(得分:0)
我还有一个要添加的概念。方法触发异常,让您处理不正常的问题并防止应用程序崩溃。 Readlin和writeline可以抛出异常,如果你没有捕获它们并且它们发生,你的程序将崩溃。使用try块来实现其意义:处理不太可能的崩溃以增强稳健性。要做好彻底的工作,你应该研究异常并编写代码以防止崩溃。