Throwing the Right Exception

Brad Abrams has a good article out there showing a list of all the .net exceptions you can throw from your code.

There are some exceptions that are not shown here, for example ConfigurationException, but this is a good starting point.

From Brad’s article:

+–System.Object  

   |

   |

   +–System.Exception  

       |

       |

       +–System.SystemException  

           |

           |

           +–System.ArgumentException  

           |   |

           |   |

           |   +–System.ArgumentNullException  

           |   |

           |   |

           |   +–System.ArgumentOutOfRangeException  

           |   |

           |   |

           |   +–System.DuplicateWaitObjectException  

           |

           |

           +–System.ArithmeticException  

           |   |

           |   |

           |   +–System.DivideByZeroException  

           |   |

           |   |

           |   +–System.OverflowException  

           |   |

           |   |

           |   +–System.NotFiniteNumberException

           |

           |

           +–System.ArrayTypeMismatchException  

           |

           |

           +–System.ExecutionEngineException  

           |

           |

           +–System.FormatException  

           |

           |

           +–System.IndexOutOfRangeException  

           |

           |

           +–System.InvalidCastException  

           |

           |

           +–System.InvalidOperationException  

           |   |

           |   |

           |   +–System.ObjectDisposedException  

           |

           |

           +–System.InvalidProgramException  

           |

           |

           +–System.IO.IOException  

           |   |

           |   |

           |   +–System.IO.DirectoryNotFoundException  

           |   |

           |   |

           |   +–System.IO.EndOfStreamException  

           |   |

           |   |

           |   +–System.IO.FileLoadException  

           |   |

           |   |

           |   +–System.IO.FileNotFoundException  

           |   |

           |   |

           |   +–System.IO.PathTooLongException  

           |

           |

           +–System.NotImplementedException  

           |

           |

           +–System.NotSupportedException  

           |

           |

           +–System.NullReferenceException  

           |

           |

           +–System.OutOfMemoryException  

           |

           |

           +–System.RankException  

           |

           |

           +–System.Security.SecurityException  

           |

           |

           +–System.Security.VerificationException  

           |

           |

           +–System.StackOverflowException  

           |

           |

           +–System.Threading.SynchronizationLockException  

           |

           |

           +–System.Threading.ThreadAbortException  

           |

           |

           +–System.Threading.ThreadStateException  

           |

           |

           +–System.TypeInitializationException  

           |

           |

           +–System.UnauthorizedAccessException 

Jeff Atwood put up another article where he uses a little console app to find all classes named “*Exception”. 

Here is his list:

System.AppDomainUnloadedException
System.ApplicationException
System.ArgumentException
System.ArgumentNullException
System.ArgumentOutOfRangeException
System.ArithmeticException
System.ArrayTypeMismatchException
System.BadImageFormatException
System.CannotUnloadAppDomainException
System.ComponentModel.Design.CheckoutException
System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.InvalidEnumArgumentException
System.ComponentModel.LicenseException
System.ComponentModel.WarningException
System.ComponentModel.Win32Exception
System.Configuration.ConfigurationException
System.ContextMarshalException
System.Data.ConstraintException
System.Data.DataException
System.Data.DBConcurrencyException
System.Data.DeletedRowInaccessibleException
System.Data.DuplicateNameException
System.Data.EvaluateException
System.Data.ExprException
System.Data.InRowChangingEventException
System.Data.InvalidConstraintException
System.Data.InvalidExpressionException
System.Data.MissingPrimaryKeyException
System.Data.NoNullAllowedException
System.Data.Odbc.OdbcException
System.Data.OleDb.OleDbException
System.Data.ReadOnlyException
System.Data.RowNotInTableException
System.Data.SqlClient._ValueException
System.Data.SqlClient.SqlException
System.Data.SqlTypes.SqlNullValueException
System.Data.SqlTypes.SqlTruncateException
System.Data.SqlTypes.SqlTypeException
System.Data.StrongTypingException
System.Data.SyntaxErrorException
System.Data.TypedDataSetGeneratorException
System.Data.VersionNotFoundException
System.DivideByZeroException
System.DllNotFoundException
System.Drawing.Printing.InvalidPrinterException
System.DuplicateWaitObjectException
System.EntryPointNotFoundException
System.Exception
System.ExecutionEngineException
System.FieldAccessException
System.FormatException
System.IndexOutOfRangeException
System.InvalidCastException
System.InvalidOperationException
System.InvalidProgramException
System.IO.DirectoryNotFoundException
System.IO.EndOfStreamException
System.IO.FileLoadException
System.IO.FileNotFoundException
System.IO.InternalBufferOverflowException
System.IO.IOException
System.IO.IsolatedStorage.IsolatedStorageException
System.IO.PathTooLongException
System.Management.ManagementException
System.MemberAccessException
System.Messaging.MessageQueueException
System.MethodAccessException
System.MissingFieldException
System.MissingMemberException
System.MissingMethodException
System.MulticastNotSupportedException
System.Net.CookieException
System.Net.ProtocolViolationException
System.Net.Sockets.SocketException
System.Net.WebException
System.NotFiniteNumberException
System.NotImplementedException
System.NotSupportedException
System.NullReferenceException
System.ObjectDisposedException
System.OutOfMemoryException
System.OverflowException
System.PlatformNotSupportedException
System.RankException
System.Reflection.AmbiguousMatchException
System.Reflection.CustomAttributeFormatException
System.Reflection.InvalidFilterCriteriaException
System.Reflection.ReflectionTypeLoadException
System.Reflection.TargetException
System.Reflection.TargetInvocationException
System.Reflection.TargetParameterCountException
System.Resources.MissingManifestResourceException
System.Runtime.InteropServices.COMException
System.Runtime.InteropServices.ExternalException
System.Runtime.InteropServices.InvalidComObjectException
System.Runtime.InteropServices.InvalidOleVariantTypeException
System.Runtime.InteropServices.MarshalDirectiveException
System.Runtime.InteropServices.SafeArrayRankMismatchException
System.Runtime.InteropServices.SafeArrayTypeMismatchException
System.Runtime.InteropServices.SEHException
System.Runtime.Remoting.MetadataServices.SUDSGeneratorException
System.Runtime.Remoting.MetadataServices.SUDSParserException
System.Runtime.Remoting.RemotingException
System.Runtime.Remoting.RemotingTimeoutException
System.Runtime.Remoting.ServerException
System.Runtime.Serialization.SerializationException
System.Security.Cryptography.CryptographicException
System.Security.Cryptography.CryptographicUnexpectedOperationException
System.Security.Policy.PolicyException
System.Security.SecurityException
System.Security.VerificationException
System.Security.XmlSyntaxException
System.ServiceProcess.TimeoutException
System.StackOverflowException
System.SystemException
System.Threading.SynchronizationLockException
System.Threading.ThreadAbortException
System.Threading.ThreadInterruptedException
System.Threading.ThreadStateException
System.Threading.ThreadStopException
System.TypeInitializationException
System.TypeLoadException
System.TypeUnloadedException
System.UnauthorizedAccessException
System.UriFormatException
System.Web.HttpApplication+CancelModuleException
System.Web.HttpCompileException
System.Web.HttpException
System.Web.HttpParseException
System.Web.HttpRequestValidationException
System.Web.HttpUnhandledException
System.Web.Services.Discovery.InvalidContentTypeException
System.Web.Services.Discovery.InvalidDocumentContentsException
System.Web.Services.Protocols.SoapException
System.Web.Services.Protocols.SoapHeaderException
System.Windows.Forms.AxHost+InvalidActiveXStateException
System.Xml.Schema.XmlSchemaException
System.Xml.XmlException
System.Xml.XPath.XPathException
System.Xml.Xsl.XsltCompileException


The code used to create this list (.net 1.1) is:


Sub Main()
ReflectionSearch(".*exception$")
Console.ReadLine()
End Sub

Sub ReflectionSearch(ByVal strPattern As String)
Dim a As Reflection.Assembly
Dim m As Reflection.Module
Dim t As Type
Dim al As New ArrayList
Dim sl As New SortedList
Dim strAssemblyName As String

For Each strAssemblyName In DefaultAssemblyList()
a = Reflection.Assembly.Load(strAssemblyName)
For Each m In a.GetModules
For Each t In m.GetTypes
al.Add(t)
Dim strFullName As String = t.FullName
If Regex.IsMatch(strFullName, strPattern, RegexOptions.IgnoreCase) Then
sl.Add(strFullName, Nothing)
End If
Next
Next
Next

Dim de As DictionaryEntry
For Each de In sl
Console.WriteLine(de.Key)
Next
Console.WriteLine(sl.Count.ToString & " matches for " & strPattern)
End Sub

Function DefaultAssemblyList() as ArrayList
Dim al As New ArrayList
With al
.Add("mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
.Add("System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
.Add("System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
.Add("System.Runtime.Remoting, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
.Add("System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
.Add("System.Xml, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
.Add("System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.DirectoryServices, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Drawing.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Messaging, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Runtime.Serialization.Formatters.Soap, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Security, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.ServiceProcess, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Web, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Web.Services, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
.Add("System.Management, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
End With
Return al
End Function

System.Xml.Xsl.XsltException

VS.Net Macro for Generating Simple and CSLA Property Accessors

Here are a few macros I wrote to generate property accessors from your class level variables.

These Macros are absolutely not an example of great coding.  They are really pretty crappy, but they do the job, so as I kept tweaking them I never went back to clean up the code or look into more elegant ways to accomplish this stuff.

Some notes about these macros:

1) dasBlog’s code display tools somehow screws up the LFs, so if you cut and paste this code you might want to first paste it into Word, or WordPad.

2) These macros need some space between your last bit of code and the end of your class.  In other words, the line directly above “End Class” can’t have code in it.  Fixing this bug wouldn’t be a big deal but I haven’t done it yet.

3) These macros will allow formatting of your variables/accessors in any of the following ways:

private csClassLevelString as String '*** property name "ClassLevelString"
private mModuleLevelInt as Integer '*** property name "ModuleLevelInt"
private _SomeObject as Object '*** property name "SomeObject"
private camelCaseBoolean as Boolean '*** WON'T work: property will be named "CaseBoolean"

4) To use these macros, simply declare your class level (instance) variables.  Then with your mouse, highlight the ones you want to create property accessors for.  You need to highlight the entire definition from “private” to data type, and of course you can highlight a bunch at 1 time.  i.e. I could highlight the entire code block above and it would produce 4 property accessors.

5) Again… this code… well it kinda sucks.  So if you are looking for a lesson on producing good code, avert your eyes, but the output is good.

 

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module Module1

    Public Sub AddClassProperties()
        Call AddClassProperties(False)
    End Sub
    Public Sub AddCslaProperties()
        Call AddClassProperties(True)
    End Sub

    ‘ highlight the private properties
    Private Sub AddClassProperties(ByVal useCsla As Boolean)

        Dim oTextSelection As TextSelection = DTE.ActiveWindow.Selection
        Dim iLinesSelected = oTextSelection.TextRanges.Count
        Dim colPropertyList As New Collection()
        Dim iIndex As Integer
        Dim oStart As EditPoint = oTextSelection.TopPoint.CreateEditPoint()
        Dim oEnd As TextPoint = oTextSelection.BottomPoint

        ‘Create an Undo context object so all the changes can be
        ‘undone by CTRL+Z
        Dim oUnDo As UndoContext = DTE.UndoContext

        ‘Supress the User Interface. This will make it run faster
        ‘and make all the changes appear once
        DTE.SuppressUI = True

        Try

            oUnDo.Open(“Comment Line”)

            Dim sProperty As String
            Dim sLineOfText As String

            Do While (oStart.LessThan(oEnd))

                sLineOfText = oStart.GetText(oStart.LineLength).Trim
                ‘*** do some kind of simple check to make sure that this line
                ‘*** isn’t blank and isn’t some other kind of code or comment
                If (sLineOfText.IndexOf(” As “) >= 0 And ( _
                    (sLineOfText.IndexOf(“Public “) >= 0) Or _
                    (sLineOfText.IndexOf(“Private “) >= 0) Or _
                    (sLineOfText.IndexOf(“Dim “) >= 0) Or _
                    (sLineOfText.IndexOf(“Protected “) >= 0) Or _
                    (sLineOfText.IndexOf(“Friend “) >= 0) Or _
                    (sLineOfText.IndexOf(“ReDim “) >= 0) Or _
                    (sLineOfText.IndexOf(“Shared “) >= 0) Or _
                    (sLineOfText.IndexOf(“Static “) >= 0) _
                    )) Then

                    sProperty = oStart.GetText(oStart.LineLength).Trim.Replace(” New “, ” “).Replace(“()”, “”)

                    colPropertyList.Add(sProperty)
                End If

                oStart.LineDown()
                oStart.StartOfLine()

            Loop

            If colPropertyList.Count > 0 Then

                For Each sProperty In colPropertyList
                    Call InsertProperty(sProperty, useCsla)
                Next

            Else
                MsgBox(“You must select the class properties”)
            End If

        Catch ex As System.Exception

            Debug.WriteLine(ex)
            If MsgBoxResult.Yes = MsgBox(“Error: “ & ex.ToString & vbCrLf & “Undo Changes?”, MsgBoxStyle.YesNo) Then
                oUnDo.SetAborted()
            End If

            Return
        Finally

            ‘If an error occured, then need to make sure that the undo context is cleaned up.
            ‘Otherwise, the editor can be left in a perpetual undo context
            If oUnDo.IsOpen Then
                oUnDo.Close()
            End If

            DTE.SuppressUI = False
        End Try

    End Sub

    Private Sub InsertProperty(ByVal sProp As String, Optional ByVal UseCsla As Boolean = False)
        Dim oTextSelection As TextSelection = DTE.ActiveWindow.Selection
        Dim sMember As String = sProp.Substring(sProp.IndexOf(” “)).Trim
        Dim sDataType As String
        Dim sName As String
        Dim i As Integer
        Dim iAscVal As Integer

        i = sMember.IndexOf(“(“)
        If Not i = -1 Then
            sMember = sMember.Substring(0, i)
        End If

        i = sMember.IndexOf(“=”)
        If Not i = -1 Then
            sMember = sMember.Substring(0, i)
        End If

        sDataType = sMember.Substring(sMember.IndexOf(” As “) + 1)

        For i = 0 To sMember.Length 1
            ‘iAscVal = Asc(Mid(sName, i, 1))
            iAscVal = Asc(sMember.Chars(i))
            If iAscVal > 64 And iAscVal < 91 Then
                sName = sMember.Substring(i)
                Exit For
            End If
        Next i

        sName = sName.Substring(0, sName.IndexOf(” As “) + 1).Trim

        If sName.Length = 0 Then
            MsgBox(“Unable to process the class property: “ & sMember & “.  This is usually caused by an incorrect naming convention (e.g. not cxName)”)
            Return
        End If

        sMember = sMember.Substring(0, sMember.Length sDataType.Length).Trim

        With oTextSelection
            Dim pt As TextPoint = .ActivePoint.CodeElement(vsCMElement.vsCMElementClass).GetEndPoint(vsCMPart.vsCMPartWhole)
            If pt Is Nothing Then
                pt = .ActivePoint.CodeElement(vsCMElement.vsCMElementStruct).GetEndPoint(vsCMPart.vsCMPartWhole)
            End If
            .MoveToPoint(pt)
            .LineUp()
            .EndOfLine()

            .Text = “Public Property “ & sName & “() “ & sDataType
            .NewLine()
            If UseCsla Then
                .Text = “CanReadProperty(True)”
                .NewLine()
            End If
            .Text = “Return “ & sMember
            .StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText)
            .StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn, True)
            .Copy()
            .LineDown(False, 3)
            DTE.ExecuteCommand(“Edit.Paste”)
            If UseCsla Then
                .Text = “CanWriteProperty(True)”
                .NewLine()
                .Text = “If Me.” & sMember & ” <> Value then”
                .NewLine()
            End If
            .Text = “Me.” & sMember & ” = Value”
            If UseCsla Then
                .NewLine()
                .Text = “PropertyHasChanged()”
            End If
            .LineDown(False, 2)
            If UseCsla Then
                .LineDown(False, 1)

            End If
            .NewLine(2)

        End With

    End Sub

End Module

 

 

Select DataSource and Visual Studio Errors

I recently ran into a nebulous problem when creating a windows app with vs.net 2005.

I would select the DataBindings or DataSource properties from the proeprties window (click the dropdown) and VS would give me an “Object reference not set to an instance of an object” error.

Fantastic!

I finally figured out the problem was caused by a recent rename of a misspelled class.

This class was being used by one of the datasources.  As soon as I changed the name of that class, the datasource became invalid, and I guess when VS tries to get a list of the these datasources for the dropdown it just blows up.

Once I deleted the problematic datasource everything went back to normal.