简化字符串异常检查

时间:2013-10-09 20:05:57

标签: .net vb.net string winforms try-catch

在我的代码中,我将运行一个进程并检索部分标准错误输出(一个数字)以引发一个发送进度号的事件。

有时我在“.First”方法的这一行有一个例外,因为字符串没有任何东西可以拆分:

out = mp3gain_For_NonTag.StandardError.ReadLine.Trim.Split("%").First

问题是我想添加必要的检查以避免该异常而不执行Try / Catch,因为在我的速度测试中我注意到此过程中的try / catch会大大降低性能。

我想简化执行必要检查的代码但没有捕获任何异常(到目前为止我添加的检查将比try / catch快速执行)。

以下是代码:

Private Shared Sub Run_MP3Gain_NotTag()

    mp3gain_For_NonTag.Start() ' Run process

    Dim out as string  = mp3gain_For_NonTag.StandardError.ReadToEnd

    While Not mp3gain_For_NonTag.HasExited

        If Not String.IsNullOrEmpty(out) Then
            ' This would generate numbers between 1 to 100
            out = mp3gain_For_NonTag.StandardError.ReadLine.Trim.Split("%").First
        End If

        If Integer.TryParse(out, 0) Then
            RaiseEvent MP3Gain_Progress(out)
        End If

    End While

    RaiseEvent MP3Gain_Exited()

End Sub

...有关其他信息,这是我不想做的一个示例,我可以说在这个修改过的代码中添加一个try catch,即使没有捕获任何异常,这也会降低性能很多:

Private Shared Sub Run_MP3Gain_NotTag()

    mp3gain_For_NonTag.Start() ' Run process

    Dim out as string = mp3gain_For_NonTag.StandardError.ReadToEnd 

    While Not mp3gain_For_NonTag.HasExited

        Try
            out = mp3gain_For_NonTag.StandardError.ReadLine.Trim.Split("%").First
            RaiseEvent MP3Gain_Progress(out)
        Catch : End Try

    End While

    RaiseEvent MP3Gain_Exited()

End Sub

5 个答案:

答案 0 :(得分:2)

我认为.FirstOrDefault()可能是您的答案。

再看看它。我不认为你的问题是第一种方法。 First抛出的异常是一种症状。您的问题是您通过读取到流的末尾设置out,然后通过尝试读取另一行来运行Split,这将返回任何内容,因此异常。只需拆分out,一切都应该没问题:

Dim out as string  = mp3gain_For_NonTag.StandardError.ReadToEnd

While Not mp3gain_For_NonTag.HasExited

    If Not String.IsNullOrEmpty(out) Then
        ' This would generate numbers between 1 to 100
        out = out.Trim.Split("%").First()
    End If

答案 1 :(得分:1)

检查拆分字符的索引(%),如果找到则进行拆分,如下所示:

If out.IndexOf("%") > -1 Then
    ' Do split logic here
End If

答案 2 :(得分:1)

尝试使用检查错误消息中“%”值的函数并返回适当的值。

out = ParseError(mp3gain_For_NonTag.StandardError.ReadLine.Trim())

Private Function ParseError(msg As String) As String
    Dim retVal As String = msg
    If msg.Contains("%") Then retVal = msg.Split("%").First
    Return retVal
End Function

答案 3 :(得分:1)

ReadLine的结果粘贴到另一个变量上并对其运行String.IsNullOrEmpty(),然后对其进行修剪,对其运行String.IsNullOrEmpty()。如果你仍然没问题,拆分它并做第一个。没有错误,比你让它错误并抓住它更快。

Dim x as string = mp3gain_For_NonTag.StandardError.ReadLine
if Not String.IsNullOrEmpty(x) then
 x = x.trim
 If Not String.IsNullOrEmpty(x) then
  out = x.Split("%").First
 End If
End If

答案 4 :(得分:1)

尝试/捕获块本身不会损害性能;只有在实际抛出异常并且发现性能受到影响时才会发生。

话虽这么说,如果你可以完全避免使用异常,你当然应该这样做。在这种情况下,您可以轻松检查Split的结果是否至少包含一个元素:

Dim parts = out = mp3gain_For_NonTag.StandardError.ReadLine.Trim.Split("%")
If parts.Length > 0 Then
    out = parts.First
End If

另一个选择是使用FirstOrDefault代替First;如果没有结果,它将返回Nothing