mirror of https://github.com/icsharpcode/ILSpy.git
12 changed files with 4475 additions and 9 deletions
@ -0,0 +1,91 @@ |
|||||||
|
Imports System |
||||||
|
Imports Microsoft.VisualBasic |
||||||
|
|
||||||
|
Module VBOnErrorCorrectness |
||||||
|
Sub Main() |
||||||
|
ResumeNext() |
||||||
|
GoToHandler() |
||||||
|
GoToHandlerResumeNext() |
||||||
|
Console.WriteLine(GoToHandlerResume(3)) |
||||||
|
GoToHandlerResumeLabel() |
||||||
|
Try |
||||||
|
GoToZero() |
||||||
|
Catch ex As InvalidOperationException |
||||||
|
Console.WriteLine("outer: " & ex.Message) |
||||||
|
End Try |
||||||
|
Console.WriteLine(GoToHandlerWithResult()) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Sub FailWhilePositive(retries As Integer) |
||||||
|
If retries > 0 Then Fail("retry " & retries) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Sub Fail(message As String) |
||||||
|
Throw New InvalidOperationException(message) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Sub ResumeNext() |
||||||
|
On Error Resume Next |
||||||
|
Fail("a") |
||||||
|
Console.WriteLine("after a: " & Err.Number & " " & Err.Description) |
||||||
|
Err.Clear() |
||||||
|
Console.WriteLine("cleared: " & Err.Number) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Sub GoToHandler() |
||||||
|
On Error GoTo Handler |
||||||
|
Fail("b") |
||||||
|
Console.WriteLine("unreachable") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
Console.WriteLine("handler: " & Err.Description) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Sub GoToHandlerResumeNext() |
||||||
|
On Error GoTo Handler |
||||||
|
Fail("c1") |
||||||
|
Console.WriteLine("between") |
||||||
|
Fail("c2") |
||||||
|
Console.WriteLine("done") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
Console.WriteLine("handler: " & Err.Description) |
||||||
|
Resume Next |
||||||
|
End Sub |
||||||
|
|
||||||
|
Function GoToHandlerResume(retries As Integer) As Integer |
||||||
|
On Error GoTo Handler |
||||||
|
FailWhilePositive(retries) |
||||||
|
Return retries |
||||||
|
Handler: |
||||||
|
retries -= 1 |
||||||
|
Resume |
||||||
|
End Function |
||||||
|
|
||||||
|
Sub GoToHandlerResumeLabel() |
||||||
|
On Error GoTo Handler |
||||||
|
Fail("d") |
||||||
|
Done: |
||||||
|
Console.WriteLine("done") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
Console.WriteLine("handler: " & Err.Description) |
||||||
|
Resume Done |
||||||
|
End Sub |
||||||
|
|
||||||
|
Sub GoToZero() |
||||||
|
On Error Resume Next |
||||||
|
Fail("e1") |
||||||
|
Console.WriteLine("swallowed") |
||||||
|
On Error GoTo 0 |
||||||
|
Fail("e2") |
||||||
|
Console.WriteLine("unreachable") |
||||||
|
End Sub |
||||||
|
|
||||||
|
Function GoToHandlerWithResult() As Integer |
||||||
|
On Error GoTo Handler |
||||||
|
Return Integer.Parse("x") |
||||||
|
Handler: |
||||||
|
Return -1 |
||||||
|
End Function |
||||||
|
End Module |
||||||
@ -0,0 +1,91 @@ |
|||||||
|
using System; |
||||||
|
using System.Runtime.CompilerServices; |
||||||
|
using Microsoft.VisualBasic.CompilerServices; |
||||||
|
|
||||||
|
public class Issue3659 |
||||||
|
{ |
||||||
|
public static void Func(ref Issue3659 obj, object value) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public static int ShowMessage(string a, int b, string c, object d, int e) |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
internal void VBFunction(object value) |
||||||
|
{ |
||||||
|
#if OPT || LEGACY_VBC
|
||||||
|
int try0000_dispatch = -1; |
||||||
|
#else
|
||||||
|
int try0001_dispatch = -1; |
||||||
|
#endif
|
||||||
|
int num2 = default; |
||||||
|
int num = default; |
||||||
|
while (true) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
/*Note: ILSpy has introduced the following switch to emulate a goto from catch-block to try-block*/; |
||||||
|
#if OPT || LEGACY_VBC
|
||||||
|
switch (try0000_dispatch) |
||||||
|
#else
|
||||||
|
switch (try0001_dispatch) |
||||||
|
#endif
|
||||||
|
{ |
||||||
|
default: |
||||||
|
{ |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
num2 = 2; |
||||||
|
Issue3659 obj = this; |
||||||
|
Func(ref obj, RuntimeHelpers.GetObjectValue(value)); |
||||||
|
#if OPT || LEGACY_VBC
|
||||||
|
goto end_IL_0000; |
||||||
|
#else
|
||||||
|
goto end_IL_0001; |
||||||
|
#endif
|
||||||
|
} |
||||||
|
#if OPT || LEGACY_VBC
|
||||||
|
case 45: |
||||||
|
#else
|
||||||
|
case 50: |
||||||
|
#endif
|
||||||
|
num = -1; |
||||||
|
switch (num2) |
||||||
|
{ |
||||||
|
case 2: |
||||||
|
ShowMessage("VBFunction", 0, "Exception", null, 0); |
||||||
|
#if OPT || LEGACY_VBC
|
||||||
|
goto end_IL_0000; |
||||||
|
#else
|
||||||
|
goto end_IL_0001; |
||||||
|
#endif
|
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
catch (Exception ex) when ((num2 != 0) & (num == 0)) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
#if OPT || LEGACY_VBC
|
||||||
|
try0000_dispatch = 45; |
||||||
|
#else
|
||||||
|
try0001_dispatch = 50; |
||||||
|
#endif
|
||||||
|
continue; |
||||||
|
} |
||||||
|
throw ProjectData.CreateProjectError(-2146828237); |
||||||
|
continue; |
||||||
|
#if OPT || LEGACY_VBC
|
||||||
|
end_IL_0000: |
||||||
|
#else
|
||||||
|
end_IL_0001: |
||||||
|
#endif
|
||||||
|
break; |
||||||
|
} |
||||||
|
if (num != 0) |
||||||
|
{ |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,17 @@ |
|||||||
|
Imports System |
||||||
|
Public Class Issue3659 |
||||||
|
Public Shared Sub Func(ByRef obj As Issue3659, value As Object) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Function ShowMessage(a As String, b As Integer, c As String, d As Object, e As Integer) As Integer |
||||||
|
Return 0 |
||||||
|
End Function |
||||||
|
|
||||||
|
Friend Sub VBFunction(value As Object) |
||||||
|
On Error GoTo Handler |
||||||
|
Func(Me, value) |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
ShowMessage("VBFunction", 0, "Exception", Nothing, 0) |
||||||
|
End Sub |
||||||
|
End Class |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,107 @@ |
|||||||
|
Imports System |
||||||
|
Imports Microsoft.VisualBasic |
||||||
|
|
||||||
|
Public Class VBOnError |
||||||
|
Public Shared Sub ResumeNext() |
||||||
|
On Error Resume Next |
||||||
|
Console.WriteLine("A") |
||||||
|
Console.WriteLine("B") |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Function ResumeNextWithResult() As Integer |
||||||
|
On Error Resume Next |
||||||
|
Dim x As Integer = 1 |
||||||
|
x = x \ 0 |
||||||
|
Return x |
||||||
|
End Function |
||||||
|
|
||||||
|
Public Shared Sub ResumeNextErrNumber() |
||||||
|
On Error Resume Next |
||||||
|
Console.WriteLine("A") |
||||||
|
If Err.Number <> 0 Then |
||||||
|
Console.WriteLine(Err.Description) |
||||||
|
Err.Clear() |
||||||
|
End If |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub GoToHandler() |
||||||
|
On Error GoTo Handler |
||||||
|
Console.WriteLine("Body") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
Console.WriteLine(Err.Description) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub GoToHandlerResumeNext() |
||||||
|
On Error GoTo Handler |
||||||
|
Console.WriteLine("A") |
||||||
|
Console.WriteLine("B") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
Console.WriteLine(Err.Number) |
||||||
|
Resume Next |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub GoToHandlerResume(retries As Integer) |
||||||
|
On Error GoTo Handler |
||||||
|
Console.WriteLine("Body") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
retries -= 1 |
||||||
|
If retries > 0 Then |
||||||
|
Resume |
||||||
|
End If |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub GoToHandlerResumeLabel() |
||||||
|
On Error GoTo Handler |
||||||
|
Console.WriteLine("Body") |
||||||
|
Done: |
||||||
|
Console.WriteLine("Done") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
Console.WriteLine(Err.Description) |
||||||
|
Resume Done |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub GoToZero() |
||||||
|
On Error Resume Next |
||||||
|
Console.WriteLine("A") |
||||||
|
On Error GoTo 0 |
||||||
|
Console.WriteLine("B") |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub GoToMinusOne() |
||||||
|
On Error GoTo Handler |
||||||
|
Console.WriteLine("A") |
||||||
|
Exit Sub |
||||||
|
Handler: |
||||||
|
On Error GoTo -1 |
||||||
|
On Error GoTo Handler2 |
||||||
|
Console.WriteLine("B") |
||||||
|
Exit Sub |
||||||
|
Handler2: |
||||||
|
Console.WriteLine("C") |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub SwitchHandlers() |
||||||
|
On Error GoTo Handler1 |
||||||
|
Console.WriteLine("A") |
||||||
|
On Error GoTo Handler2 |
||||||
|
Console.WriteLine("B") |
||||||
|
Exit Sub |
||||||
|
Handler1: |
||||||
|
Console.WriteLine("Handler1") |
||||||
|
Resume Next |
||||||
|
Handler2: |
||||||
|
Console.WriteLine("Handler2") |
||||||
|
Resume Next |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Function GoToHandlerWithResult() As Integer |
||||||
|
On Error GoTo Handler |
||||||
|
Return Integer.Parse("x") |
||||||
|
Handler: |
||||||
|
Return -1 |
||||||
|
End Function |
||||||
|
End Class |
||||||
@ -0,0 +1,619 @@ |
|||||||
|
using System; |
||||||
|
using System.IO; |
||||||
|
|
||||||
|
using Microsoft.VisualBasic.CompilerServices; |
||||||
|
|
||||||
|
public class VBTryCatchFinally |
||||||
|
{ |
||||||
|
private static bool Condition() |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchBare() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchVariable() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
Exception ex2 = ex; |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchSpecificType() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (IOException ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
IOException ex2 = ex; |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchUnusedVariable() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (InvalidOperationException ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
InvalidOperationException ex2 = ex; |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchWhen() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception projectError) when (((Func<bool>)delegate { |
||||||
|
// Could not convert BlockContainer to single expression
|
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
return Condition(); |
||||||
|
}).Invoke()) |
||||||
|
{ |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchVariableWhen() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) when (((Func<bool>)delegate { |
||||||
|
// Could not convert BlockContainer to single expression
|
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
return ex.Message != null; |
||||||
|
}).Invoke()) |
||||||
|
{ |
||||||
|
Console.WriteLine(ex.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchSpecificTypeWhen() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (IOException ex) when (((Func<bool>)delegate { |
||||||
|
// Could not convert BlockContainer to single expression
|
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
return Condition(); |
||||||
|
}).Invoke()) |
||||||
|
{ |
||||||
|
Console.WriteLine(ex.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchExistingLocal() |
||||||
|
{ |
||||||
|
Exception value = null; |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
value = ex; |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
Console.WriteLine(value); |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchExistingLocalWhen() |
||||||
|
{ |
||||||
|
Exception value = null; |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) when (((Func<bool>)delegate { |
||||||
|
// Could not convert BlockContainer to single expression
|
||||||
|
#if LEGACY_VBC
|
||||||
|
value = ex; |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
#else
|
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
value = ex; |
||||||
|
#endif
|
||||||
|
return ex.Message != null; |
||||||
|
}).Invoke()) |
||||||
|
{ |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
Console.WriteLine(value); |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
Exception ex2 = ex; |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchBareFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryCatchWhenFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) when (((Func<bool>)delegate { |
||||||
|
// Could not convert BlockContainer to single expression
|
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
return Condition(); |
||||||
|
}).Invoke()) |
||||||
|
{ |
||||||
|
Console.WriteLine(ex.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryMultipleCatch() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (FileNotFoundException ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
FileNotFoundException ex2 = ex; |
||||||
|
Console.WriteLine(ex2.FileName); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
catch (IOException ex3) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex3); |
||||||
|
IOException ex4 = ex3; |
||||||
|
Console.WriteLine(ex4.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryMultipleCatchFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (FileNotFoundException ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
FileNotFoundException ex2 = ex; |
||||||
|
Console.WriteLine(ex2.FileName); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
catch (IOException ex3) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex3); |
||||||
|
IOException ex4 = ex3; |
||||||
|
Console.WriteLine(ex4.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryMultipleCatchWhen() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (IOException ex) when (((Func<bool>)delegate { |
||||||
|
// Could not convert BlockContainer to single expression
|
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
return Condition(); |
||||||
|
}).Invoke()) |
||||||
|
{ |
||||||
|
Console.WriteLine(ex.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
catch (Exception projectError) when (((Func<bool>)delegate { |
||||||
|
// Could not convert BlockContainer to single expression
|
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
return Condition(); |
||||||
|
}).Invoke()) |
||||||
|
{ |
||||||
|
Console.WriteLine("Catch When"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
catch (Exception ex2) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex2); |
||||||
|
Exception ex3 = ex2; |
||||||
|
Console.WriteLine(ex3.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void EmptyTryFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void EmptyCatch() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void EmptyFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
Exception ex2 = ex; |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
#if !OPT || LEGACY_VBC
|
||||||
|
finally |
||||||
|
{ |
||||||
|
} |
||||||
|
#endif
|
||||||
|
} |
||||||
|
|
||||||
|
public static void ExitTryInTry(bool b) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
if (!b) |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
Console.WriteLine("End"); |
||||||
|
} |
||||||
|
|
||||||
|
public static void ExitTryInCatch(bool b) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
if (b) |
||||||
|
{ |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
Console.WriteLine("End"); |
||||||
|
} |
||||||
|
|
||||||
|
public static void ExitTryWithFinally(bool b) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
if (!b) |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
Console.WriteLine("End"); |
||||||
|
} |
||||||
|
|
||||||
|
public static void Rethrow() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
Exception ex2 = ex; |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
throw; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void ThrowNew() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
Exception innerException = ex; |
||||||
|
throw new InvalidOperationException("Catch", innerException); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static int ReturnFromTry() |
||||||
|
{ |
||||||
|
int result; |
||||||
|
try |
||||||
|
{ |
||||||
|
result = 1; |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
result = 2; |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public static int ReturnAfterTry() |
||||||
|
{ |
||||||
|
#if !(LEGACY_VBC && OPT)
|
||||||
|
int result; |
||||||
|
#endif
|
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
Exception ex2 = ex; |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
#if LEGACY_VBC && OPT
|
||||||
|
int result = -1; |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
return result; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
#else
|
||||||
|
result = -1; |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
#if LEGACY_VBC
|
||||||
|
goto IL_0032; |
||||||
|
#elif OPT
|
||||||
|
goto IL_0029; |
||||||
|
#else
|
||||||
|
goto IL_0031; |
||||||
|
#endif
|
||||||
|
} |
||||||
|
result = 0; |
||||||
|
#if LEGACY_VBC
|
||||||
|
goto IL_0032; |
||||||
|
IL_0032: |
||||||
|
#elif OPT
|
||||||
|
goto IL_0029; |
||||||
|
IL_0029: |
||||||
|
#else
|
||||||
|
goto IL_0031; |
||||||
|
IL_0031: |
||||||
|
#endif
|
||||||
|
return result; |
||||||
|
#endif
|
||||||
|
} |
||||||
|
|
||||||
|
public static void NestedTryInTry() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Inner Try"); |
||||||
|
} |
||||||
|
catch (IOException ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
IOException ex2 = ex; |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (Exception ex3) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex3); |
||||||
|
Exception ex4 = ex3; |
||||||
|
Console.WriteLine(ex4.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void NestedTryInCatch() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
catch (Exception ex) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex); |
||||||
|
Exception ex2 = ex; |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine(ex2.Message); |
||||||
|
} |
||||||
|
catch (Exception ex3) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(ex3); |
||||||
|
Exception ex4 = ex3; |
||||||
|
Console.WriteLine(ex4.Message); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void NestedTryInFinally() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Try"); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Console.WriteLine("Inner Try"); |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
Console.WriteLine("Inner Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void TryInLoop() |
||||||
|
{ |
||||||
|
int num = 0; |
||||||
|
do |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
switch (num) |
||||||
|
{ |
||||||
|
case 5: |
||||||
|
break; |
||||||
|
case 8: |
||||||
|
return; |
||||||
|
default: |
||||||
|
Console.WriteLine(num); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
catch (Exception projectError) |
||||||
|
{ |
||||||
|
ProjectData.SetProjectError(projectError); |
||||||
|
Console.WriteLine("Catch"); |
||||||
|
ProjectData.ClearProjectError(); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.WriteLine("Finally"); |
||||||
|
} |
||||||
|
num = checked(num + 1); |
||||||
|
} while (num <= 9); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,308 @@ |
|||||||
|
Imports System |
||||||
|
Imports System.IO |
||||||
|
|
||||||
|
Public Class VBTryCatchFinally |
||||||
|
Private Shared Function Condition() As Boolean |
||||||
|
Return True |
||||||
|
End Function |
||||||
|
|
||||||
|
Public Shared Sub TryFinally() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchBare() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchVariable() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchSpecificType() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As IOException |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchUnusedVariable() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As InvalidOperationException |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchWhen() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch When Condition() |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchVariableWhen() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception When ex.Message IsNot Nothing |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchSpecificTypeWhen() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As IOException When Condition() |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchExistingLocal() |
||||||
|
Dim ex As Exception = Nothing |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
Console.WriteLine(ex) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchExistingLocalWhen() |
||||||
|
Dim ex As Exception = Nothing |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex When ex.Message IsNot Nothing |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
Console.WriteLine(ex) |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchFinally() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchBareFinally() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch |
||||||
|
Console.WriteLine("Catch") |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryCatchWhenFinally() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception When Condition() |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryMultipleCatch() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As FileNotFoundException |
||||||
|
Console.WriteLine(ex.FileName) |
||||||
|
Catch ex As IOException |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Catch |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryMultipleCatchFinally() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As FileNotFoundException |
||||||
|
Console.WriteLine(ex.FileName) |
||||||
|
Catch ex As IOException |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryMultipleCatchWhen() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As IOException When Condition() |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Catch When Condition() |
||||||
|
Console.WriteLine("Catch When") |
||||||
|
Catch ex As Exception |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub EmptyTryFinally() |
||||||
|
Try |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub EmptyCatch() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub EmptyFinally() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Finally |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub ExitTryInTry(b As Boolean) |
||||||
|
Try |
||||||
|
If b Then |
||||||
|
Exit Try |
||||||
|
End If |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
Console.WriteLine("End") |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub ExitTryInCatch(b As Boolean) |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch |
||||||
|
If b Then |
||||||
|
Exit Try |
||||||
|
End If |
||||||
|
Console.WriteLine("Catch") |
||||||
|
End Try |
||||||
|
Console.WriteLine("End") |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub ExitTryWithFinally(b As Boolean) |
||||||
|
Try |
||||||
|
If b Then |
||||||
|
Exit Try |
||||||
|
End If |
||||||
|
Console.WriteLine("Try") |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
Console.WriteLine("End") |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub Rethrow() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Throw |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub ThrowNew() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception |
||||||
|
Throw New InvalidOperationException("Catch", ex) |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Function ReturnFromTry() As Integer |
||||||
|
Try |
||||||
|
Return 1 |
||||||
|
Catch |
||||||
|
Return 2 |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
End Function |
||||||
|
|
||||||
|
Public Shared Function ReturnAfterTry() As Integer |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Return -1 |
||||||
|
End Try |
||||||
|
Return 0 |
||||||
|
End Function |
||||||
|
|
||||||
|
Public Shared Sub NestedTryInTry() |
||||||
|
Try |
||||||
|
Try |
||||||
|
Console.WriteLine("Inner Try") |
||||||
|
Catch ex As IOException |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
End Try |
||||||
|
Catch ex As Exception |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub NestedTryInCatch() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Catch ex As Exception |
||||||
|
Try |
||||||
|
Console.WriteLine(ex.Message) |
||||||
|
Catch ex2 As Exception |
||||||
|
Console.WriteLine(ex2.Message) |
||||||
|
End Try |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub NestedTryInFinally() |
||||||
|
Try |
||||||
|
Console.WriteLine("Try") |
||||||
|
Finally |
||||||
|
Try |
||||||
|
Console.WriteLine("Inner Try") |
||||||
|
Catch |
||||||
|
Console.WriteLine("Inner Catch") |
||||||
|
End Try |
||||||
|
End Try |
||||||
|
End Sub |
||||||
|
|
||||||
|
Public Shared Sub TryInLoop() |
||||||
|
For i = 0 To 9 |
||||||
|
Try |
||||||
|
If i = 5 Then |
||||||
|
Continue For |
||||||
|
End If |
||||||
|
If i = 8 Then |
||||||
|
Exit For |
||||||
|
End If |
||||||
|
Console.WriteLine(i) |
||||||
|
Catch |
||||||
|
Console.WriteLine("Catch") |
||||||
|
Finally |
||||||
|
Console.WriteLine("Finally") |
||||||
|
End Try |
||||||
|
Next |
||||||
|
End Sub |
||||||
|
End Class |
||||||
Loading…
Reference in new issue