2013-10-09 24 views
2

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

有时候我在这一行的“首先”方法异常“引起的字符串无关分裂:

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 

...而对于更多的信息,这是什么,我不希望做一个样品,我可以说,在这增加了尝试捕捉像改性壳聚糖代码代码,即使没有捕获任何异常亲切,这将降低性能提升不少:

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 
+1

你的方法看起来不错。除此之外,我想你应该在[codereview.stackexchange.com](http://codereview.stackexchange.com/)上更好地发布这样的问题。 –

+0

@Tim Schmelter非常感谢我不知道代码评论存在一个部分。 – ElektroStudios

+0

第一个人也很好看。关于不使用异常的说法是完全正确的,因为空虚并不是特例,这就是为什么它会成为一个性能问题。看不到任何真正需要“改进”的版本1.什么不适合你? –

回答

2

我想.FirstOrDefault()可能是你的答案在这里。

再来看看它。我不认为你的问题是第一种方法。 First引发的异常是一个症状。你的问题是你设置out通过读到流的末尾,然后通过尝试读取另一行来运行分割,这将不会返回任何内容,因此是例外。刚刚拆分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 
+0

就是这样,真的没有用过它,我在描述中看到,如果有任何元素返回,它永远不会抛出任何异常,谢谢我需要一些分钟来试试看它是否工作正常 – ElektroStudios

+0

重复您的问题并找到您的错误。 – tinstaafl

1

检查分割字符(%)的指数只有做好分割,一旦发现,像这样:

If out.IndexOf("%") > -1 Then 
    ' Do split logic here 
End If 
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 
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 
1

Try/Catch块本身不会损害性能;只有当异常事实上被抛出并被捕获时,性能才会受到影响。

这就是说,如果你可以避免完全使用异常,你应该做到这一点。在这种情况下,您可以轻松地检查如果Split结果至少有一个元素:

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

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

+0

非常感谢我需要一些分钟来测试它 – ElektroStudios