VBUC
Visual Basic Upgrade Companion. VB6 Converter for .NET & Web.

VB6
ASP
.NET7 supportDownload Now

WebMAP
Cloud Application Migration Tools Transform Desktop Applications

C#
Silverlight
Access
VB.NET
PowerBuilder
Winforms
ASP.NET Web Forms

SnowConvert
The best available tools to perform code migrations from a source database or Spark application to Snowflake.

Oracle
Spark Scala
Spark Python
SQL Server
Teradata

Data Solutions
The premier productivity workbench designed and optimized for teams using Snowflake.

Translation with SnowConvert
Edit, Debug & Deploy
Automated Test Case Generation
Metadata Analysis
Source Code Management

Get Started
There are countless ways to take advantage of BlackDiamond Studio and SnowConvert.

Migration and Other Snowflake Services
Get Up and Running with Snowpark
Using the SnowConvert Trial
Build a Cross-Platform Object Inventory

Monetize Your Data

Time to Mobilize
Free Assessment Tool

VB to .NET

Legacy error handling routines to .NET

On Error GoTo to Try-Catch

By-default, VB6 to VB.NET conversions keep On Error statements the same to achieve a higher functional equivalence and a smoother migration process.  However, the VBUC can be configured to generate try-catch structured error-handling statements.  In the case of C#, the conversion to try-catch is mandatory.

Some very complex spaghetti-code patterns might not be recognized by the VBUC, but it already supports a large amount of cases with different combinations of statements (On Error Goto, Labels, Goto, Resume, Exit Sub/Function, Break, etc.)

Some straightforward examples are shown below.

Example 1 (simple case with block finalizer):

[VB6]

On Error Goto errLabel
<CodeBlock1>
<Exit Sub/Function>
errlabel:
<CodeBlock2> 

[C#.NET]

try
{
<CodeBlock1>
<Return>
}
catch
{
<CodeBlock2>
}

Example 2 (simple case with no block finalizer):

[VB6]

On Error Goto errLabel
<CodeBlock1>
<Exit Sub/Function>
errlabel:
<CodeBlock2> 

[C#.NET]

try
{
<CodeBlock1>
<Return>
}
catch
{
<CodeBlock2>
} 

Example 3 (common case with resume statement):

[VB6]

On Error Goto errLabel
<CodeBlock1>
resumeLabel:
<CodeBlock2>
<Exit Sub/Function>
errlabel:
<CodeBlock3>
Resume resumeLabel 

[C#.NET]

try
{
<CodeBlock1>
<Return>
}
catch
{
<CodeBlock3>
}
finally 
{
<CodeBlock2>
} 

On Error Resume Next Conversion

In .NET the equivalent structured model for On Error Resume Next would be a Try-Catch for every single statement in the block where the “resume next” is active. Applying that kind of conversion would result in very low quality code. Instead, it is recommended that the error-prone statements be manually identified and handled individually with a different model. However, the VBUC recognizes some cases where there is only one statement that can throw an exception, and converts the On Error Resume Next with a Try-Catch for that statement.

[VB6]

Public Function FileExists(ByVal strFile As String) As Integer

    Dim lSize As Long

    On Error Resume Next
    '* set lSize to -1
    lSize = -1
    'Get the length of the file
    lSize = FileLen(strFile)
    If lSize = 0 Then
        '* File is zero bytes and exists
        FileExists = 0
    ElseIf lSize > 0 Then
        '* File Exists
        FileExists = 1
    Else
        '* Does not exist
        FileExists = -1
    End If
End Function

Resulting C# Code

The Visual Basic Upgrade Companion’s resulting source code will contain a EWI to indicate the need to perform a manual change over the generated code to obtain functional equivalence. The original method returns a 0 if the file exists with 0 bytes size, a 1 if the file exists and its contents are larger than 0 and -1 if the file doesn’t exist.

static public int FileExists( string strFile)
{
            
//UPGRADE_TODO: (1069) Error handling statement (On Error Resume Next) was converted to a complex pattern which might not be equivalent to the original. More Information: http://www.vbtonet.com/ewis/ewi1069.aspx
try
{
    //* set lSize to -1
    int lSize = -1;
    //Get the length of the file
    lSize = (int) (new FileInfo(strFile)).Length;
    if (lSize == 0)
    {
        //* File is zero bytes and exists
        return 0;
    } else if (lSize > 0) { 
        //* File Exists
        return 1;
    } else
    {
        //* Does not exist
        return -1;
    }
}
catch (Exception exc)
{
    throw new Exception("Migration Exception: The following exception could be handled in a different way after the conversion: " + exc.Message);
}
return 0;
}

The manual change need to take this example to functional equivalence is to take the “else” code block (return -1;) and place it into the catch handling block.

Err Object to Uses of try-catch Caught Exception

When converting unstructured error handling to structured try-catch statements, some patterns are applied to remove obsolete uses of Err object inside the error handling block. 

The Err members Raise, Number, Source, and Description are considered and converted to equivalent patterns of the caught exception. Other cases where these members cannot be converted to uses of the exception are marked with a warning comment.

Talk To An Engineer