在我的代码中,我将运行一个进程并检索部分标准错误输出(一个数字)以引发一个发送进度号的事件。
有时我在“.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
答案 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
。