2

我有一些变量从客户端传递到服务器。其中一个变量应该作为双精度接收,但有时我们会从引发异常的客户端获得一些字符串或空变量。

我的问题是,从性能方面来看,将变量包装在 try、catch 中并在失败时应用默认值是否更好:

        Dim expectDouble As Double
        Try
            expectDouble = Request.Form("pastFromClient")
        Catch ex As Exception
            expectDouble = 0 'Default to zero
        End Try

或者最初将所有传入变量视为字符串对象并针对正则表达式运行它们?

        Dim expectDouble As Double
        If Regex.IsMatch(Request.Form("pastFromClient").toString, "^\d{1,}\.{0,1}\d{0,4}$") Then
            expectDouble = Request.Form("pastFromClient")
        Else
            expectDouble = 0 'Default to zero
        End If

后一个选项可能看起来有点晦涩,但我一直对到处都有 try, catch 语句感到不安。

4

4 回答 4

4

可能是最重要的一点,你应该设置OPTION STRICTON一般。那么你的代码甚至不会复制什么是好东西。

它不会编译,因为Request.Form返回一个字符串,但expectDouble 它是一个Double. 字符串不能隐式转换为双精度。

在这种情况下,您应该使用Double.Parseor Double.TryParse。性能不是主要原因,而是故障安全性和可读性。

Dim expectDouble As Double
If Double.TryParse(Request.Form("pastFromClient"), expectDouble) Then
   ' here you have the value of expectDouble '
End If
于 2013-05-17T13:35:48.203 回答
0

正则表达式通常很慢,Try/Catch 块也是如此。在这种情况下,我会采用第二种方法,但我不会使用正则表达式。

于 2013-05-17T13:27:30.700 回答
0

正如蒂姆正确指出应避免隐式转换,在这种情况下,您可以在一行中执行操作,以便以下

 Dim expectDouble As Double
 If Regex.IsMatch(Request.Form("pastFromClient").toString, "^\d{1,}\.{0,1}\d{0,4}$") Then
    expectDouble = Request.Form("pastFromClient")
 Else
    expectDouble = 0 'Default to zero
 End If

变成

Dim expectDouble As Double
If NOT Double.TryParse(Request.Form("pastFromClient"), expectDouble) Then expectDouble = 0
于 2013-05-17T14:14:15.630 回答
0

其他都是正确的。您想自己明确地进行铸造。此外,您的正常程序流程不应依赖于捕获的异常。它们被称为“例外”是有原因的。

以下是使用三元运算符在一行中执行此操作的方法:

Dim expectDouble As Double = If(Double.TryParse(Request.Form("pastFromClient"), expectDouble), expectDouble, 0)

如果传入表单的值是一个有效的双精度值,那么 expectDouble 将保存该值;否则,它默认为零。如果需要,您可以将零更改为其他默认值。

于 2013-05-17T19:32:48.350 回答