File: Microsoft\VisualBasic\CompilerServices\ExceptionUtils.vb
Web Access
Project: src\src\Microsoft.VisualBasic.Forms\src\Microsoft.VisualBasic.Forms.vbproj (Microsoft.VisualBasic.Forms)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
 
Imports System.Runtime.InteropServices
Imports System.Threading
 
Namespace Microsoft.VisualBasic.CompilerServices
 
    ' Implements error utilities for Basic
    Friend Module ExceptionUtils
 
        ''' <summary>
        '''  Returns a new instance of <see cref="ArgumentException"/> with the message from resource file and the Exception.ArgumentName property set.
        ''' </summary>
        ''' <param name="argumentName">The name of the argument (parameter). Not localized.</param>
        ''' <param name="resourceKey">The resource ID.</param>
        ''' <param name="placeHolders">Strings that will replace place holders in the resource string, if any.</param>
        ''' <returns>A new instance of <see cref="ArgumentException"/>.</returns>
        ''' <remarks>This is the preferred way to construct an argument exception.</remarks>
        Friend Function GetArgumentExceptionWithArgName(
            argumentName As String,
            resourceKey As String,
            ParamArray placeHolders() As String) As ArgumentException
 
            Return New ArgumentException(GetResourceString(resourceKey, placeHolders), argumentName)
        End Function
 
        ''' <summary>
        '''  Returns a new instance of <see cref="ArgumentNullException"/> with message: "Argument cannot be Nothing."
        ''' </summary>
        ''' <param name="argumentName">The name of the argument (parameter). Not localized.</param>
        ''' <returns>A new instance of <see cref="ArgumentNullException"/>.</returns>
        Friend Function GetArgumentNullException(argumentName As String) As ArgumentNullException
 
            Return New ArgumentNullException(argumentName, GetResourceString(SR.General_ArgumentNullException))
        End Function
 
        ''' <summary>
        '''  Returns a new instance of <see cref="ArgumentNullException"/> with the message from resource file.
        ''' </summary>
        ''' <param name="argumentName">The name of the argument (parameter). Not localized.</param>
        ''' <param name="resourceKey">The resource ID.</param>
        ''' <param name="placeHolders">Strings that will replace place holders in the resource string, if any.</param>
        ''' <returns>A new instance of <see cref="ArgumentNullException"/>.</returns>
        Friend Function GetArgumentNullException(
            argumentName As String,
            resourceKey As String,
            ParamArray placeHolders() As String) As ArgumentNullException
 
            Return New ArgumentNullException(argumentName, GetResourceString(resourceKey, placeHolders))
        End Function
 
        ''' <summary>
        '''  Returns a new instance of <see cref="IO.DirectoryNotFoundException"/> with the message from resource file.
        ''' </summary>
        ''' <param name="resourceKey">The resource ID.</param>
        ''' <param name="placeHolders">Strings that will replace place holders in the resource string, if any.</param>
        ''' <returns>A new instance of <see cref="IO.DirectoryNotFoundException"/>.</returns>
        Friend Function GetDirectoryNotFoundException(
            resourceKey As String,
            ParamArray placeHolders() As String) As IO.DirectoryNotFoundException
 
            Return New IO.DirectoryNotFoundException(GetResourceString(resourceKey, placeHolders))
        End Function
 
        ''' <summary>
        '''  Returns a new instance of <see cref="IO.FileNotFoundException"/> with the message from resource file.
        ''' </summary>
        ''' <param name="fileName">The file name (path) of the not found file.</param>
        ''' <param name="resourceKey">The resource ID.</param>
        ''' <param name="placeHolders">Strings that will replace place holders in the resource string, if any.</param>
        ''' <returns>A new instance of <see cref="IO.FileNotFoundException"/>.</returns>
        Friend Function GetFileNotFoundException(
            fileName As String,
            resourceKey As String,
            ParamArray placeHolders() As String) As IO.FileNotFoundException
 
            Return New IO.FileNotFoundException(GetResourceString(resourceKey, placeHolders), fileName)
        End Function
 
        ''' <summary>
        '''  Returns a new instance of <see cref="InvalidOperationException"/> with the message from resource file.
        ''' </summary>
        ''' <param name="resourceKey">The resource ID.</param>
        ''' <param name="placeHolders">Strings that will replace place holders in the resource string, if any.</param>
        ''' <returns>A new instance of <see cref="InvalidOperationException"/>.</returns>
        Friend Function GetInvalidOperationException(
            resourceKey As String,
            ParamArray placeHolders() As String) As InvalidOperationException
 
            Return New InvalidOperationException(GetResourceString(resourceKey, placeHolders))
        End Function
 
        ''' <summary>
        '''  Returns a new instance of <see cref="IO.IOException"/> with the message from resource file.
        ''' </summary>
        ''' <param name="resourceKey">The resource ID.</param>
        ''' <param name="placeHolders">Strings that will replace place holders in the resource string, if any.</param>
        ''' <returns>A new instance of <see cref="IO.IOException"/>.</returns>
        Friend Function GetIOException(
            resourceKey As String,
            ParamArray placeHolders() As String) As IO.IOException
 
            Return New IO.IOException(GetResourceString(resourceKey, placeHolders))
        End Function
 
        Friend Function GetResourceString(
            resourceKey As String,
            ParamArray args() As String) As String
 
            Return String.Format(Thread.CurrentThread.CurrentCulture, resourceKey, args)
        End Function
 
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <param name="resourceId">A <see cref="VbErrors"/> value that will become the ResourceKey</param>
        ''' <returns>A <see langword="String"/> localized version of the resource.</returns>
        Friend Function GetResourceString(resourceId As VbErrors) As String
            Dim resourceKey As String = $"ID{CStr(resourceId)}"
            Return SR.GetResourceString(resourceKey, resourceKey)
        End Function
 
        ''' <summary>
        '''  Returns a new instance of <see cref="ComponentModel.Win32Exception"/> with the message from resource file and the last Win32 error.
        ''' </summary>
        ''' <param name="resourceKey">The resource ID.</param>
        ''' <param name="placeHolders">Strings that will replace place holders in the resource string, if any.</param>
        ''' <returns>A new instance of <see cref="ComponentModel.Win32Exception"/>.</returns>
        ''' <remarks>There is no way to exclude the Win32 error so this function will call Marshal.GetLastWin32Error all the time.</remarks>
        Friend Function GetWin32Exception(
            resourceKey As String,
            ParamArray placeHolders() As String) As ComponentModel.Win32Exception
 
            Return New ComponentModel.Win32Exception(Marshal.GetLastWin32Error(), GetResourceString(resourceKey, placeHolders))
        End Function
 
        Friend Function VbMakeException(resourceId As Integer) As Exception
            Dim description As String = String.Empty
 
            If resourceId > 0 AndAlso resourceId <= &HFFFFI Then
                description = GetResourceString(DirectCast(resourceId, VbErrors))
            End If
 
            Select Case resourceId
 
                Case VbErrors.FileNotFound
                    Return New IO.FileNotFoundException(description)
 
                Case VbErrors.PermissionDenied
                    Return New IO.IOException(description)
 
                Case Else
                    Return New Exception(description)
            End Select
 
        End Function
 
    End Module
End Namespace