重申在Catch子句中使用GoTo的Try语句?

时间:2019-04-05 13:17:49

标签: c# try-catch

我正在研究一些代码示例,并且看到了与以下示例相似的变体,其中之一使我感到非常好奇。

goto_tag语句之前放置try时。这完全有道理,并且只再次遍历try

retry_tag: //the goto tag to re-attempt to copy a file

try {
    fileInfo.CopyTo( toAbsolutePath + fileInfo.Name, true ); //THIS LINE MIGHT FAIL IF BUSY
} catch {
    Thread.Sleep(500); //wait a little time for file to become available.
    goto retry_tag; //go back and re-attempt to copy
}   

但是,当我看到以下内容时,我不明白。将goto_tag放在try语句中并从catch块中调用时。

try {
    retry_tag: //the goto tag to re-attempt to copy a file

    fileInfo.CopyTo( toAbsolutePath + fileInfo.Name, true ); //THIS LINE MIGHT FAIL IF BUSY
} catch {
    Thread.Sleep(500); //wait a little time for file to become available.
    goto retry_tag; //go back and re-attempt to copy
}   

try块是否已复活?还是两个示例在功能上完全相同,或者这是完全非法的操作,甚至无法编译?

这完全是出于好奇,当然,如果有其中一个,我当然更喜欢第一个示例。

感谢您的见解!

2 个答案:

答案 0 :(得分:2)

要实际回答您的问题:

不,这些不相同

第一个示例将编译;第二个是非法的。

(关于是否应该像这样编写代码的问题是另一个问题……当然,如果可以帮助,则不应这样做。)

答案 1 :(得分:1)

您可以实现简单的while而不是goto

// loop until ... 
while (true) {
  try {
    fileInfo.CopyTo(Path.Combine(toAbsolutePath, fileInfo.Name), true); 

    // ... file copied
    break;
  } 
  catch (IOException) {
    Thread.Sleep(500); //wait a little time for file to become available.       
  } 
}