<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Michael Maddox - Software Development</title>
    <link>http://www.capprime.com/software_development_weblog/</link>
    <description>Best Practices, Knowlegde Base Type Articles, General Tech Opinions, etc.</description>
    <language>en-us</language>
    <copyright>Michael Maddox</copyright>
    <lastBuildDate>Thu, 18 Sep 2008 18:27:54 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.8.5223.2</generator>
    <managingEditor>Michael.P.Maddox@gmail.com</managingEditor>
    <webMaster>Michael.P.Maddox@gmail.com</webMaster>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=13a60fe3-0eb7-45b6-993d-e2d88ce1724d</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,13a60fe3-0eb7-45b6-993d-e2d88ce1724d.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,13a60fe3-0eb7-45b6-993d-e2d88ce1724d.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=13a60fe3-0eb7-45b6-993d-e2d88ce1724d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I did not attend the <a href="http://www.businessofsoftware.org/">Business of Software
      2008</a> Conference this year, but I spent some time tracking down write-ups done
      by people who did.
   </p>
        <p>
      There is a <a href="http://wiki.businessofsoftware.org/">Business of Software 2008
      Wiki</a> with some notes (and hopefully more to come?).
   </p>
        <p>
          <a href="http://carymillsap.blogspot.com/search/label/Business%20of%20Software%202008">Cary
      Millsap</a> wrote up some notes.
   </p>
        <p>
          <a href="http://blogs.sqlservercentral.com/steve_jones/archive/tags/Business+of+Software/default.aspx">Steve
      Jones</a> wrote up some notes (and there may be more still coming).
   </p>
        <p>
          <a href="http://blog.cliffmccollum.com/search/label/Business">Cliff McCollum</a> wrote
      up some notes (and it appears there is more coming).  I just linked to his business
      tag, so that link will not necessarily be as useful a month or so from now.
   </p>
        <p>
      That's what I was able to find in a few minutes of googling.  There is probably
      more out there.
   </p>
        <p>
      I came close to going this year, but cost and timing weren't great for me.  I'll
      probably consider attending this conference next year.
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=13a60fe3-0eb7-45b6-993d-e2d88ce1724d" />
      </body>
      <title>Business of Software 2008 Conference Notes</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,13a60fe3-0eb7-45b6-993d-e2d88ce1724d.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,13a60fe3-0eb7-45b6-993d-e2d88ce1724d.aspx</link>
      <pubDate>Thu, 18 Sep 2008 18:27:54 GMT</pubDate>
      <description>&lt;p&gt;
   I did not attend the &lt;a href="http://www.businessofsoftware.org/"&gt;Business of Software
   2008&lt;/a&gt; Conference this year, but I spent some time tracking down write-ups done
   by people who did.
&lt;/p&gt;
&lt;p&gt;
   There is a &lt;a href="http://wiki.businessofsoftware.org/"&gt;Business of Software 2008
   Wiki&lt;/a&gt; with some notes (and hopefully more to come?).
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://carymillsap.blogspot.com/search/label/Business%20of%20Software%202008"&gt;Cary
   Millsap&lt;/a&gt; wrote up some notes.
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://blogs.sqlservercentral.com/steve_jones/archive/tags/Business+of+Software/default.aspx"&gt;Steve
   Jones&lt;/a&gt; wrote up some notes (and there may be more still coming).
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://blog.cliffmccollum.com/search/label/Business"&gt;Cliff McCollum&lt;/a&gt; wrote
   up some notes (and it appears there is more coming).&amp;nbsp; I just linked to his business
   tag, so that link will not necessarily be as useful a month or so from now.
&lt;/p&gt;
&lt;p&gt;
   That's what I was able to find in a few minutes of googling.&amp;nbsp; There is probably
   more out there.
&lt;/p&gt;
&lt;p&gt;
   I came close to going this year, but cost and timing weren't great for me.&amp;nbsp; I'll
   probably consider attending this conference next year.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=13a60fe3-0eb7-45b6-993d-e2d88ce1724d" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,13a60fe3-0eb7-45b6-993d-e2d88ce1724d.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=d5708bf1-b6e4-4f16-9c19-9f0103ef00fc</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,d5708bf1-b6e4-4f16-9c19-9f0103ef00fc.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,d5708bf1-b6e4-4f16-9c19-9f0103ef00fc.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d5708bf1-b6e4-4f16-9c19-9f0103ef00fc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      TheLadders.com is a job website for $100k+ jobs:
   </p>
        <p>
          <a href="http://www.theladders.com/">http://www.theladders.com/</a>
        </p>
        <p>
      They apparently don't understand how to store multiple versions of a resume in a database
      though.  You can have one resume that you either type by hand or upload (and
      they will parse it... poorly).  If you hand edit the resume either before or
      after uploading, it gets stored.  However, if for some reason you upload the
      resume again for any reason, all the hand editing (except the Professional Overview
      section) is lost.
   </p>
        <p>
      I chose not to upload my resume as I didn't want to waste a lot of time fixing whatever
      mess their parser made.  I spent hours hand editing my resume into their custom
      user interface, which is honestly not too great.  When recruiters see your resume,
      it's actually generated from the data in their database into a Microsoft Word document
      that looks semi-horrible (my two page resume became four pages with major white space
      and formatting issues).
   </p>
        <p>
      I then went to submit my resume for their "free resume critique" (assuming you are
      a paying customer, which you pretty much have to be to get any value from the website). 
      If offered me the option of using what I hand edited or uploading a Microsoft Word
      document.  I thought my two page, nicely formatted resume would do better
      in a resume critique then their ugly four page thing, so I uploaded a Word version. 
      It did not take long to figure out what I stated above: that upload deleted all
      the data I hand entered and replaced it with their parsed garbage.  Multiple
      hours of work lost because I was tricked into believing that they might have a clue
      on how important it is to treat user entered data with high regard and not delete
      it without the user's knowledge.
   </p>
        <p>
      So, I clicked their "Live Chat" button to talk to a support representative where I
      learned that the only thing they could restore was the Professional Overview section. 
      The support person was pleasant, but evasive: she appears to have had this conversation
      multiple times before.  I was not pleased.  She offered two additional weeks
      on my monthly subscription.  I said I honestly wasn't getting much, if any, value
      from TheLadders and said I'd rather cancel my subscription and get a refund, which
      she did without a hiccup.
   </p>
        <p>
      I've been using web applications for a long time and I honestly can't remember having
      a website delete my data without asking me first, yet now it's happened to me twice
      in one day by two websites that should have known better.  Users beware.
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=d5708bf1-b6e4-4f16-9c19-9f0103ef00fc" />
      </body>
      <title>TheLadders.com fails to store data I entered causing me to lose hours of work</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,d5708bf1-b6e4-4f16-9c19-9f0103ef00fc.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,d5708bf1-b6e4-4f16-9c19-9f0103ef00fc.aspx</link>
      <pubDate>Wed, 17 Sep 2008 20:48:27 GMT</pubDate>
      <description>&lt;p&gt;
   TheLadders.com is a job website for $100k+ jobs:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.theladders.com/"&gt;http://www.theladders.com/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   They apparently don't understand how to store multiple versions of a resume in a database
   though.&amp;nbsp; You can have one resume that you either type by hand or upload (and
   they will parse it... poorly).&amp;nbsp; If you hand edit the resume either before or
   after uploading, it gets stored.&amp;nbsp; However, if for some reason you upload the
   resume again for any reason, all the hand editing (except the Professional Overview
   section) is lost.
&lt;/p&gt;
&lt;p&gt;
   I chose not to upload my resume as I didn't want to waste a lot of time fixing whatever
   mess their parser made.&amp;nbsp; I spent hours hand editing my resume into their custom
   user interface, which is honestly not too great.&amp;nbsp; When recruiters see your resume,
   it's actually generated from the data in their database into a Microsoft Word document
   that looks semi-horrible (my two page resume became four pages with major white space
   and formatting issues).
&lt;/p&gt;
&lt;p&gt;
   I then went to submit my resume for their "free resume critique" (assuming you are
   a paying customer, which you pretty much have to be to get any value from the website).&amp;nbsp;
   If offered me the option of using what I hand edited or uploading a Microsoft Word
   document.&amp;nbsp; I thought my two page, nicely formatted&amp;nbsp;resume would do better
   in a resume critique then their ugly four page thing, so I uploaded a Word version.&amp;nbsp;
   It did not take long to figure out what I stated above: that upload&amp;nbsp;deleted all
   the data I hand entered and replaced it with their parsed garbage.&amp;nbsp; Multiple
   hours of work lost because I was tricked into believing that they might have a clue
   on how important it is to treat user entered data with high regard and not delete
   it without the user's knowledge.
&lt;/p&gt;
&lt;p&gt;
   So, I clicked their "Live Chat" button to talk to a support representative where I
   learned that the only thing they could restore was the Professional Overview section.&amp;nbsp;
   The support person was pleasant, but evasive: she appears to have had this conversation
   multiple times before.&amp;nbsp; I was not pleased.&amp;nbsp; She offered two additional weeks
   on my monthly subscription.&amp;nbsp; I said I honestly wasn't getting much, if any, value
   from TheLadders and said I'd rather cancel my subscription and get a refund, which
   she did without a hiccup.
&lt;/p&gt;
&lt;p&gt;
   I've been using web applications for a long time and I honestly can't remember having
   a website delete my data without asking me first, yet now it's happened to me twice
   in one day by two websites that should have known better.&amp;nbsp; Users beware.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=d5708bf1-b6e4-4f16-9c19-9f0103ef00fc" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,d5708bf1-b6e4-4f16-9c19-9f0103ef00fc.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=f9baa23d-68c1-4135-8466-d0b535a27795</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,f9baa23d-68c1-4135-8466-d0b535a27795.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,f9baa23d-68c1-4135-8466-d0b535a27795.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f9baa23d-68c1-4135-8466-d0b535a27795</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Stack Overflow is a new Q&amp;A website for developers, which is still in beta. 
      You can read more about it here:
   </p>
        <p>
          <a href="http://www.joelonsoftware.com/items/2008/09/15.html">http://www.joelonsoftware.com/items/2008/09/15.html</a>
        </p>
        <p>
      The URL to access Stack Overflow is here:
   </p>
        <p>
          <a href="http://stackoverflow.com/">http://stackoverflow.com/</a>
        </p>
        <p>
      I love the idea/theory/vision behind this.  I have been reading Joel Spolsky
      and Jeff Atwood's blogs for years and I really enjoy and respect them.
   </p>
        <p>
      The execution of the idea leaves a lot to be desired.  My expectations were probably
      way too high.  Joel and Jeff blog extensively about usability, yet the usability
      of Stack Overflow drives me crazy.
   </p>
        <p>
      Here is specific feedback on what I would like to see changed with the implementation
      of Stack Overflow:
   </p>
        <p>
      Let's start at the beginning:  Login.  If you go to login to Stackoverflow
      (login is optional, but required for the vast majority of the features of the web
      site), you run into something called OpenID.  For some people OpenID is probably
      a non-issue.  For me, it is an issue.  You can <a href="http://www.google.com/search?hl=en&amp;q=openid&amp;aq=f&amp;oq=">Google
      OpenID</a> and read more about it, I'm not going to try to describe it.  Here
      are my issues with OpenID:
   </p>
        <p>
      1) I immediately have to make a hard choice:  Do I trust some third party with
      my OpenID information or do I roll my own?  I don't like either option at all. 
      Rolling your own OpenID is non-trivial and under-documented.  I don't have any
      trust for any of the third party OpenID providers.  So, I of course threw up
      my hands and chose the path of least resistance: I just arbitrarily chose an OpenID
      provider and I pray it doesn't hurt me later.  I'm still upset about this.<br />
      2) I have to read extensively to understand what OpenID is.  Honestly, I don't
      care what it is and I don't care for it.  It's solving a problem I don't have
      now and I don't foresee ever having.  Why does Stack Overflow force me down this
      path?<br />
      3) I now have a really long, difficult to remember, user name.
   </p>
        <p>
      Okay, that's a pretty horrible way to start off, but I'm now logged in.
   </p>
        <p>
      I find a question I like, so I try to upvote it.  Oh, I can't do that until I
      have 15 reputation.  Earning reputation is either really easy or really hard,
      depending how good you are at that "mini-game".  Honestly, I don't care to play
      the mini-game.  So my ability to contribute to StackOverflow is limited, I can
      live with that.  Usage of the site over time will eventually unlock most of the
      reputation based features automatically as long as you are logged in while using the
      site.
   </p>
        <p>
      So, I'm looking at questions and answers and I see these little bronze and silver
      badges by people's names.  I wonder what that is about.  Well, unless you
      happen to click on the badges button at the top of the page, it's actually fairly
      difficult to find out.  Search is unhelpful.  The official FAQ is unhelpful. 
      The unofficial FAQ is unhelpful.  This is the best part: You are not supposed
      to ask questions on StackOverflow about how to use StackOverflow.  Seriously.
   </p>
        <p>
      Okay, so the usability leaves a lot to be desired so far.  I don't think my "new
      user" experience is so different from other people, but that's how I've been made
      to feel so far.
   </p>
        <p>
      So, if you have a question about how to use StackOverflow, what are you supposed to
      do?  Use Uservoice:
   </p>
        <p>
          <a href="http://stackoverflow.uservoice.com/">http://stackoverflow.uservoice.com/</a>
        </p>
        <p>
      What is uservoice?  It's a third party feedback web application.  The usability
      of user voice is much, much worse than Stack Overflow itself.  You get dumped
      on a webpage with very little clue where you landed, why you landed there, or what
      you are supposed to do.
   </p>
        <p>
      Let's go through the exercise of trying to figure out what the badges by people's
      names mean here.  I type in "badge" in the "I suggest you..." box.  I get
      5 matches, none of which look like what I want.  So, at this point I guess I
      should "create new idea".  I get a tiny little popup box to type in.  I
      can't edit or delete it once I submit it.  I can't comment on it unless
      I login.  Comments can't be longer than 400 characters.  When I try to login
      to UserVoice, I can't use my StackOverflow (aka OpenID) credentials.  If I need
      to include my StackOverflow user name in my Uservoice comment, I need to type it out
      as the two systems aren't really integrated with each other (although you might get
      the impression that they are integrated with each other due to the fact that StackOverflow
      is displayed much more prominately on the UserVoice site than UserVoice is).
   </p>
        <p>
      At this point, I'm mostly hate the user experience.  Let's look at some of the
      other comments on UserVoice about the user experience:
   </p>
        <p>
      Here's a problem that new users are having that got an admin response that I think
      is dismissive:
   </p>
        <p>
          <a href="http://stackoverflow.uservoice.com/pages/general/suggestions/25645">http://stackoverflow.uservoice.com/pages/general/suggestions/25645</a>
        </p>
        <p>
      Here's what I would agree is a very valid point about the FAQ confusion (in fact,
      I would criticize the FAQ situation much more heavily):
   </p>
        <p>
          <a href="http://stackoverflow.uservoice.com/pages/general/suggestions/26292">http://stackoverflow.uservoice.com/pages/general/suggestions/26292</a>
        </p>
        <p>
      Here's a "feature" that I hate, but has been declined by the administrators as not
      going to be fixed:
   </p>
        <p>
          <a href="http://stackoverflow.uservoice.com/pages/general/suggestions/24812">http://stackoverflow.uservoice.com/pages/general/suggestions/24812</a>
        </p>
        <p>
      Users hate when they spend time entering data into your system and it disappears with
      zero indication why.  That is a horrible way to treat users.
   </p>
        <p>
      In general, the tone of admin responses I see on User Voice is horrible and makes
      me not want to contribute there.
   </p>
        <p>
      --
   </p>
        <p>
      As a new user I posted a question on StackOverflow about what badges were and the
      next day that question disappeared, so I asked another question which will likely
      also disappear.  While this link remains valid, you can read more of the details
      of my non-wonderful StackOverflow experience:
   </p>
        <p>
          <a href="http://stackoverflow.com/questions/82208/yesterday-i-posted-a-question-and-now-its-gone-where-did-it-go-how-do-i-view-it">http://stackoverflow.com/questions/82208/yesterday-i-posted-a-question-and-now-its-gone-where-did-it-go-how-do-i-view-it</a>
        </p>
        <p>
      Right now, I have to say "thumbs way down".  I'm pretty upset with how I was
      treated as a new user and I'm not sure if I should give the site another chance if/when
      it moves out of beta.  Maybe the site will take off and everyone will love it
      and I won't have a choice.
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=f9baa23d-68c1-4135-8466-d0b535a27795" />
      </body>
      <title>StackOverflow Impressions - Too Many Rough Edges</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,f9baa23d-68c1-4135-8466-d0b535a27795.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,f9baa23d-68c1-4135-8466-d0b535a27795.aspx</link>
      <pubDate>Wed, 17 Sep 2008 15:59:24 GMT</pubDate>
      <description>&lt;p&gt;
   Stack Overflow is a new Q&amp;amp;A website for developers, which is still in beta.&amp;nbsp;
   You can read more about it here:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.joelonsoftware.com/items/2008/09/15.html"&gt;http://www.joelonsoftware.com/items/2008/09/15.html&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   The URL to access Stack Overflow is here:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://stackoverflow.com/"&gt;http://stackoverflow.com/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   I love the idea/theory/vision behind this.&amp;nbsp; I have been reading Joel Spolsky
   and Jeff Atwood's blogs for years and I really enjoy and respect them.
&lt;/p&gt;
&lt;p&gt;
   The execution of the idea leaves a lot to be desired.&amp;nbsp; My expectations were probably
   way too high.&amp;nbsp; Joel and Jeff blog extensively about usability, yet the usability
   of Stack Overflow drives me crazy.
&lt;/p&gt;
&lt;p&gt;
   Here is specific feedback on what I would like to see changed with the implementation
   of Stack Overflow:
&lt;/p&gt;
&lt;p&gt;
   Let's start at the beginning:&amp;nbsp; Login.&amp;nbsp; If you go to login to Stackoverflow
   (login is optional, but required for the vast majority of the features of the web
   site), you run into something called OpenID.&amp;nbsp; For some people OpenID is probably
   a non-issue.&amp;nbsp; For me, it is an issue.&amp;nbsp; You can &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=openid&amp;amp;aq=f&amp;amp;oq="&gt;Google
   OpenID&lt;/a&gt; and read more about it, I'm not going to try to describe it.&amp;nbsp; Here
   are my issues with OpenID:
&lt;/p&gt;
&lt;p&gt;
   1) I immediately have to make a hard choice:&amp;nbsp; Do I trust some third party with
   my OpenID information or do I roll my own?&amp;nbsp; I don't like either option at all.&amp;nbsp;
   Rolling your own OpenID is non-trivial and under-documented.&amp;nbsp; I don't have any
   trust for any of the third party OpenID providers.&amp;nbsp; So, I of course threw up
   my hands and chose the path of least resistance: I just arbitrarily chose an OpenID
   provider and I pray it doesn't hurt me later.&amp;nbsp; I'm still upset about this.&lt;br&gt;
   2) I have to read extensively to understand what OpenID is.&amp;nbsp; Honestly, I don't
   care what it is and I don't care for it.&amp;nbsp; It's solving a problem I don't have
   now and I don't foresee ever having.&amp;nbsp; Why does Stack Overflow force me down this
   path?&lt;br&gt;
   3) I now have a really long, difficult to remember, user name.
&lt;/p&gt;
&lt;p&gt;
   Okay, that's a pretty horrible way to start off, but I'm now logged in.
&lt;/p&gt;
&lt;p&gt;
   I find a question I like, so I try to upvote it.&amp;nbsp; Oh, I can't do that until I
   have 15 reputation.&amp;nbsp; Earning reputation is either really easy or really hard,
   depending how good you are at that "mini-game".&amp;nbsp; Honestly, I don't care to play
   the mini-game.&amp;nbsp; So my ability to contribute to StackOverflow is limited, I can
   live with that.&amp;nbsp; Usage of the site over time will eventually unlock most of the
   reputation based features automatically as long as you are logged in while using the
   site.
&lt;/p&gt;
&lt;p&gt;
   So, I'm looking at questions and answers and I see these little bronze and silver
   badges by people's names.&amp;nbsp; I wonder what that is about.&amp;nbsp; Well, unless you
   happen to click on the badges button at the top of the page, it's actually fairly
   difficult to find out.&amp;nbsp; Search is unhelpful.&amp;nbsp; The official FAQ is unhelpful.&amp;nbsp;
   The unofficial FAQ is unhelpful.&amp;nbsp; This is the best part: You are not supposed
   to ask questions on StackOverflow about how to use StackOverflow.&amp;nbsp; Seriously.
&lt;/p&gt;
&lt;p&gt;
   Okay, so the usability leaves a lot to be desired so far.&amp;nbsp; I don't think my "new
   user" experience is so different from other people, but that's how I've been made
   to feel so far.
&lt;/p&gt;
&lt;p&gt;
   So, if you have a question about how to use StackOverflow, what are you supposed to
   do?&amp;nbsp; Use Uservoice:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://stackoverflow.uservoice.com/"&gt;http://stackoverflow.uservoice.com/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   What is uservoice?&amp;nbsp; It's a third party feedback web application.&amp;nbsp; The usability
   of user voice is much, much worse than Stack Overflow itself.&amp;nbsp; You get dumped
   on a webpage with very little clue where you landed, why you landed there, or what
   you are supposed to do.
&lt;/p&gt;
&lt;p&gt;
   Let's go through the exercise of trying to figure out what the badges by people's
   names mean here.&amp;nbsp; I type in "badge" in the "I suggest you..." box.&amp;nbsp; I get
   5 matches, none of which look like what I want.&amp;nbsp; So, at this point I guess I
   should "create new idea".&amp;nbsp; I get a tiny little popup box to type in.&amp;nbsp; I
   can't edit&amp;nbsp;or delete&amp;nbsp;it once I submit it.&amp;nbsp; I can't comment on it unless
   I login.&amp;nbsp; Comments can't be longer than 400 characters.&amp;nbsp; When I try to login
   to UserVoice, I can't use my StackOverflow (aka OpenID) credentials.&amp;nbsp; If I need
   to include my StackOverflow user name in my Uservoice comment, I need to type it out
   as the two systems aren't really integrated with each other (although you might get
   the impression that they are integrated with each other due to the fact that StackOverflow
   is displayed much more prominately on the UserVoice site than UserVoice is).
&lt;/p&gt;
&lt;p&gt;
   At this point, I'm mostly hate the user experience.&amp;nbsp; Let's look at some of the
   other comments on UserVoice about the user experience:
&lt;/p&gt;
&lt;p&gt;
   Here's a problem that new users are having that got an admin response that I think
   is dismissive:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://stackoverflow.uservoice.com/pages/general/suggestions/25645"&gt;http://stackoverflow.uservoice.com/pages/general/suggestions/25645&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Here's what I would agree is a very valid point about the FAQ confusion (in fact,
   I would criticize&amp;nbsp;the&amp;nbsp;FAQ situation&amp;nbsp;much more heavily):
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://stackoverflow.uservoice.com/pages/general/suggestions/26292"&gt;http://stackoverflow.uservoice.com/pages/general/suggestions/26292&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Here's a "feature" that I hate, but has been declined by the administrators as not
   going to be fixed:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://stackoverflow.uservoice.com/pages/general/suggestions/24812"&gt;http://stackoverflow.uservoice.com/pages/general/suggestions/24812&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Users hate when they spend time entering data into your system and it disappears with
   zero indication why.&amp;nbsp; That is a horrible way to treat users.
&lt;/p&gt;
&lt;p&gt;
   In general, the tone of admin responses I see on User Voice is horrible and makes
   me not want to contribute there.
&lt;/p&gt;
&lt;p&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   As a new user I posted a question on StackOverflow about what badges were and the
   next day that question disappeared, so I asked another question which will likely
   also disappear.&amp;nbsp; While this link remains valid, you can read more of the details
   of my non-wonderful StackOverflow experience:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://stackoverflow.com/questions/82208/yesterday-i-posted-a-question-and-now-its-gone-where-did-it-go-how-do-i-view-it"&gt;http://stackoverflow.com/questions/82208/yesterday-i-posted-a-question-and-now-its-gone-where-did-it-go-how-do-i-view-it&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Right now, I have to say "thumbs way down".&amp;nbsp; I'm pretty upset with how I was
   treated as a new user and I'm not sure if I should give the site another chance if/when
   it moves out of beta.&amp;nbsp; Maybe the site will take off and everyone will love it
   and I won't have a choice.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=f9baa23d-68c1-4135-8466-d0b535a27795" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,f9baa23d-68c1-4135-8466-d0b535a27795.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=578a4487-4af4-4e05-b262-f7661859f19e</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,578a4487-4af4-4e05-b262-f7661859f19e.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,578a4487-4af4-4e05-b262-f7661859f19e.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=578a4487-4af4-4e05-b262-f7661859f19e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      What is the difference between Visual Studio 2008 Standard and Visual Studio 2008
      Professional?
   </p>
        <p>
      Microsoft has provided multiple answers to this question:
   </p>
        <p>
      (1)  This answer is quick and high level:
   </p>
        <p>
          <a href="http://msdn.microsoft.com/en-gb/vs2008/products/bb980920.aspx">http://msdn.microsoft.com/en-gb/vs2008/products/bb980920.aspx</a>
        </p>
        <p>
      (2) This answer is less quick and slightly more detailed:
   </p>
        <p>
          <a href="http://msdn.microsoft.com/en-us/library/zcbsd3cz(VS.80).aspx">http://msdn.microsoft.com/en-us/library/zcbsd3cz(VS.80).aspx</a>
        </p>
        <p>
      (3) This answer is very detailed.  It comes in two flavors:
   </p>
        <p>
      Web: <a href="http://msdn.microsoft.com/en-us/vs2008/products/cc149003.aspx">http://msdn.microsoft.com/en-us/vs2008/products/cc149003.aspx</a></p>
        <p>
      Downloadable: <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=727bcfb0-b575-47ab-9fd8-4ee067bb3a37&amp;DisplayLang=en">http://www.microsoft.com/downloads/details.aspx?FamilyID=727bcfb0-b575-47ab-9fd8-4ee067bb3a37&amp;DisplayLang=en</a></p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=578a4487-4af4-4e05-b262-f7661859f19e" />
      </body>
      <title>Visual Studio 2008 Standard vs. Professional</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,578a4487-4af4-4e05-b262-f7661859f19e.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,578a4487-4af4-4e05-b262-f7661859f19e.aspx</link>
      <pubDate>Tue, 19 Aug 2008 12:22:32 GMT</pubDate>
      <description>&lt;p&gt;
   What is the difference between Visual Studio 2008 Standard and Visual Studio 2008
   Professional?
&lt;/p&gt;
&lt;p&gt;
   Microsoft has provided multiple answers to this question:
&lt;/p&gt;
&lt;p&gt;
   (1)&amp;nbsp; This answer is quick and high level:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://msdn.microsoft.com/en-gb/vs2008/products/bb980920.aspx"&gt;http://msdn.microsoft.com/en-gb/vs2008/products/bb980920.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   (2) This answer is less quick and slightly more detailed:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://msdn.microsoft.com/en-us/library/zcbsd3cz(VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/zcbsd3cz(VS.80).aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   (3) This answer is very detailed.&amp;nbsp; It comes in two flavors:
&lt;/p&gt;
&lt;p&gt;
   Web: &lt;a href="http://msdn.microsoft.com/en-us/vs2008/products/cc149003.aspx"&gt;http://msdn.microsoft.com/en-us/vs2008/products/cc149003.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Downloadable: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=727bcfb0-b575-47ab-9fd8-4ee067bb3a37&amp;amp;DisplayLang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=727bcfb0-b575-47ab-9fd8-4ee067bb3a37&amp;amp;DisplayLang=en&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=578a4487-4af4-4e05-b262-f7661859f19e" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,578a4487-4af4-4e05-b262-f7661859f19e.aspx</comments>
      <category>Knowledge Base;Visual Studio 2008</category>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=8f921c9a-b280-483a-8da1-da07a7254868</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,8f921c9a-b280-483a-8da1-da07a7254868.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,8f921c9a-b280-483a-8da1-da07a7254868.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=8f921c9a-b280-483a-8da1-da07a7254868</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      When I went to install Microsoft Visual Studio 2005 Service Pack 1 on Windows Server
      2003 I had a lot of unexpected trouble.
   </p>
        <p>
      Windows Update gave me this obscure error code:
   </p>
        <p>
      Error Code: 0x64C
   </p>
        <p>
      So, I did some googling and landed on this very helpful web page:
   </p>
        <p>
          <a href="http://mindsharpblogs.com/aaron/archive/2007/05/03/1740.aspx">Installing
      Visual Studio 2005 SP1</a>
        </p>
        <p>
      The main key was to look into the Event Log (how often I forget) and see this error:
   </p>
        <p>
      ---<br />
      Product: Microsoft Visual Studio 2005 Premier Partner Edition - ENU -- Error 1718.File
      C:\WINDOWS\Installer\66b5f.msp did not pass the digital signature check. For more
      information about a possible resolution for this problem, see <a href="http://go.microsoft.com/fwlink/?LinkId=73863">http://go.microsoft.com/fwlink/?LinkId=73863</a>.<br />
      ---
   </p>
        <p>
      I'm not even sure what "Premier Partner Edition" is.  It seems like I have that
      edition, plus the normal professional edition of VS 2005 installed.  Anyway,
      that helpful URL points to <a href="http://support.microsoft.com/?kbid=925336">KB925336</a>. 
      That knowledge base article points to a hotfix for Windows Server 2003, which is apparently
      required before installing large updates (and VS2K5 SP1 indeed appears to be large).
   </p>
        <p>
      I did dig up my original installation media and did have that in my CD drive when
      I eventually successfully got the service pack to install, but I'm pretty confident
      it was the hotfix that got everything to work and I probably didn't need the CD.
   </p>
        <p>
      It did take at least 20 minutes for the update to install (not including download
      time), so be patient.
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=8f921c9a-b280-483a-8da1-da07a7254868" />
      </body>
      <title>Installing Microsoft Visual Studio 2005 Service Pack 1 on Windows Server 2003 and Error Code: 0x64C</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,8f921c9a-b280-483a-8da1-da07a7254868.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,8f921c9a-b280-483a-8da1-da07a7254868.aspx</link>
      <pubDate>Sat, 01 Mar 2008 16:26:37 GMT</pubDate>
      <description>&lt;p&gt;
   When I went to install Microsoft Visual Studio 2005 Service Pack 1 on Windows Server
   2003 I had a lot of unexpected trouble.
&lt;/p&gt;
&lt;p&gt;
   Windows Update gave me this obscure error code:
&lt;/p&gt;
&lt;p&gt;
   Error Code: 0x64C
&lt;/p&gt;
&lt;p&gt;
   So, I did some googling and landed on this very helpful web page:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://mindsharpblogs.com/aaron/archive/2007/05/03/1740.aspx"&gt;Installing
   Visual Studio 2005 SP1&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   The main key was to look into the Event Log (how often I forget) and see this error:
&lt;/p&gt;
&lt;p&gt;
   ---&lt;br&gt;
   Product: Microsoft Visual Studio 2005 Premier Partner Edition - ENU -- Error 1718.File
   C:\WINDOWS\Installer\66b5f.msp did not pass the digital signature check. For more
   information about a possible resolution for this problem, see &lt;a href="http://go.microsoft.com/fwlink/?LinkId=73863"&gt;http://go.microsoft.com/fwlink/?LinkId=73863&lt;/a&gt;.&lt;br&gt;
   ---
&lt;/p&gt;
&lt;p&gt;
   I'm not even sure what "Premier Partner Edition" is.&amp;nbsp; It seems like I have that
   edition, plus the normal professional edition of VS 2005 installed.&amp;nbsp; Anyway,
   that helpful URL points to &lt;a href="http://support.microsoft.com/?kbid=925336"&gt;KB925336&lt;/a&gt;.&amp;nbsp;
   That knowledge base article points to a hotfix for Windows Server 2003, which is apparently
   required before installing large updates (and VS2K5 SP1 indeed appears to be large).
&lt;/p&gt;
&lt;p&gt;
   I did dig up my original installation media and did have that in my CD drive when
   I eventually successfully got the service pack to install, but I'm pretty confident
   it was the hotfix that got everything to work and I probably didn't need the CD.
&lt;/p&gt;
&lt;p&gt;
   It did take at least 20 minutes for the update to install (not including download
   time), so be patient.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=8f921c9a-b280-483a-8da1-da07a7254868" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,8f921c9a-b280-483a-8da1-da07a7254868.aspx</comments>
      <category>Knowledge Base;Visual Studio 2005</category>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=0f98cfe7-7704-494c-bbea-3011ca24a40d</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,0f98cfe7-7704-494c-bbea-3011ca24a40d.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,0f98cfe7-7704-494c-bbea-3011ca24a40d.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=0f98cfe7-7704-494c-bbea-3011ca24a40d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Every client I have done consulting at, without exception (so far), has done exception
      handling incorrectly in .NET.
   </p>
        <p>
      This should not be too surprising given that people in VB6 and C++ rarely did exception
      handling right either.
   </p>
        <p>
      In .NET (and Java), there are just a few things you have to remember (compared to
      VB6/C++) to do exception handling correctly.  Yet in ~5 years of looking for
      these simple rules, I have not yet found them (I discovered them the hard way, by
      maintaining production code that did exception handling incorrectly).
   </p>
        <p>
      Here is my attempt at documenting good (and pragmatic) exception handling practices. 
      (Microsoft's attempt is here: <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconBestPracticesForHandlingExceptions.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconBestPracticesForHandlingExceptions.asp</a>)
   </p>
        <p>
      These examples are specifically for VB.NET, but they basically apply in the same way
      to Java and C#.
   </p>
        <p>
      How not to do it:
   </p>
        <p>
      1)
   </p>
        <p>
      On Error Resume Next
   </p>
        <p>
      What you are doing:  You are ignoring *every* error and pretending it never happened
      and continuing execution.<br />
      Why that is bad:     Errors happen for a reason.  If you
      aren't even checking to see what error happened, how do you know you can safely continue
      to execute?  Continuing execution after an error occurred can easily lead to
      file or database corruption among other problems.
   </p>
        <p>
          <br />
      2)
   </p>
        <p>
      Try<br />
        ... code here ...<br />
      Catch<br />
      End Try
   </p>
        <p>
      What you are doing:  You are ignoring *every* error and pretending it never happened
      and continuing execution.<br />
      Why that is bad:     Errors happen for a reason.  If you
      aren't even checking to see what error happened, how do you know you can safely continue
      to execute?  Continuing execution after an error occurred can easily lead to
      file or database corruption among other problems.
   </p>
        <p>
          <br />
      3)
   </p>
        <p>
      Try<br />
        ... code here ...<br />
      Catch exception As Exception<br />
      End Try
   </p>
        <p>
      What you are doing:  You are ignoring *every* .NET Exception and pretending it
      never happened and continuing execution.<br />
      Why that is bad:     Errors happen for a reason.  If you
      aren't even checking to see what error happened, how do you know you can safely continue
      to execute?  Continuing execution after an error occurred can easily lead to
      file or database corruption among other problems.
   </p>
        <p>
      4)
   </p>
        <p>
      Try<br />
        ... code here ...<br />
      Catch exception As Exception<br />
        Throw exception<br />
      End Try
   </p>
        <p>
      What you are doing:  You are resetting the stack trace for the error.<br />
      Why that is bad:     A normal stack trace will show the exact
      line the error originated from.  In this scenario, the stack trace will instead
      point the Throw line as the origin of the error.
   </p>
        <p>
      --
   </p>
        <p>
      Unless you are at the absolute top of the stack (i.e. the main method or a global
      exception handler), you never want to catch exceptions of type "Exception". 
      You should only be catching Exception classes that are below Exception in the hierarchy,
      and even more strongly, the leaf nodes of the Exception class hierarchy.
   </p>
        <p>
          <br />
      How to do exception handling properly:
   </p>
        <p>
          <br />
      1)
   </p>
        <p>
      Really, try/catch is better than On Error GoTo, but this example is more for VB6 programmers
      who don't have try/catch.
   </p>
        <p>
      On Error GoTo &lt;ExceptionHandler&gt; 
   </p>
        <p>
      You need to do all of the following in the Exception Handler:<br />
      (a) Close any open resources (database connections, etc.)<br />
      (b) Check the error/error code<br />
      (c) Check the line that the error occured on<br />
      (d) Put the error (message and stack trace with line numbers) somewhere so someone
      can see it (to the screen, to a log file, to a database, etc.)<br />
      (e) Take appropriate action (i.e. return an error code from the current function,
      exit the application, etc.)
   </p>
        <p>
      2)
   </p>
        <p>
      Try<br />
        ... code here ...<br />
      Catch exception As SqlException<br />
        Log(exception.ToString, selectStatement)<br />
        Throw<br />
      End Try
   </p>
        <p>
      Why is this better:<br />
      You are catching a specific exception class (SqlException) instead of something higher
      level like Exception.<br />
      You are logging the exception to a file, database, e-mail, etc. so a support person
      can log a defect for development to look at.<br />
      You are logging the database SELECT statement that was in use at the time the exception
      occurred.<br />
      You are rethrowing the exception as is so the stack trace will remain intact.
   </p>
        <p>
      3)
   </p>
        <p>
      Try<br />
        ... code here ...<br />
      Catch innerException As SqlException<br />
        Log(innerException.ToString)<br />
        Throw New CustomException("SQL Statement [" &amp; selectStatement &amp; "]",
      innerException)<br />
      End Try
   </p>
        <p>
      Why is this better:<br />
      You are catching a specific exception class (SqlException) instead of something higher
      level like Exception.<br />
      You are logging the exception to a file, database, e-mail, etc. so a support person
      can log a defect for development to look at.<br />
      You are throwing a custom exception that the calling method may be able to deal with
      easier/more successfully than a SqlException.<br />
      You are improving the information available in the exception.<br />
      You are including the innerException so that no information is lost on the new custom
      throw.
   </p>
        <p>
      --
   </p>
        <p>
      How do deal with third party event driven code:
   </p>
        <p>
      If you are using badly behaved third party event driven code, it will sometimes throw
      away useful exception information.
   </p>
        <p>
      For example, if you are handling/overriding events thrown by third party code, and
      an exception occurs in your code, that exception should go into the third party code
      and then make it back into your code that originally called the third party code. 
      Instead, the third party code may throw away the exception (because they have bad
      exception handling as described above).
   </p>
        <p>
      In that case, before you leave your event handler, you need to catch every exception
      and log it so it doesn't get completely lost.  You should rethrow it, just in
      case the third party exception handling code is eventually fixed and they propagate
      the exception properly in the future.
   </p>
        <p>
      Try<br />
        ... code here ...<br />
      Catch innerException As Exception<br />
        LogToFile("innerException [" &amp; innerException.ToString() &amp; "]")<br />
        Throw New BizException("Exception in event handler for &lt;third party package&gt;
      Code", innerException)<br />
      End Try
   </p>
        <p>
      --
   </p>
        <p>
      A stack trace is a very important debugging tool.  If exceptions are not handled
      properly, stack traces get lost or mangled, making debugging much, much harder.
   </p>
        <p>
      Here are some code samples with accompanying stack traces:
   </p>
        <p>
      1)
   </p>
        <p>
      Here is a fairly simple example that calls a function which causes an exception to
      be thrown.
   </p>
        <p>
      This example has no try/catch block in the function, which is normal default behavior. 
      The try/catch block in the Main method is just so we can view the exception before
      the application closes and isn't necessary/useful for any other purpose.
   </p>
        <p>
      --<br />
      Module Module1<br />
          Sub Main()<br />
              Try<br />
                  Dim age As Integer<br />
                  Dim ageAsString
      As String = "a1234"
   </p>
        <p>
                  age = ConvertStringAgeToInteger(ageAsString)<br />
              Catch exception As Exception<br />
                  System.Diagnostics.Debug.WriteLine(exception.ToString)<br />
              End Try<br />
          End Sub
   </p>
        <p>
          Function ConvertStringAgeToInteger(ByVal ageAsString As String)
      As Integer<br />
              Dim age As Integer
   </p>
        <p>
              age = CInt(ageAsString)
   </p>
        <p>
              Return age<br />
          End Function<br />
      End Module<br />
      --
   </p>
        <p>
      Here is the associated stack trace.  It's pretty basic.  The DoubleType.Parse
      method threw a FormatException, which was then wrapped and rethrown in the IntegerType.FromString
      method by an InvalidCastException.  We don't have the line number in the stack
      trace for the Microsoft.VisualBasic component, but we do have the proper line numbers
      for our code.  Line 16 is the call to CInt.  Line 7 is the call to ConvertStringAgeToInteger.<br />
      --<br />
      System.InvalidCastException: Cast from string "a1234" to type 'Integer' is not valid.
      ---&gt; System.FormatException: Input string was not in a correct format.<br />
         at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value,
      NumberFormatInfo NumberFormat)<br />
         at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value)<br />
         at Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
      Value)<br />
         --- End of inner exception stack trace ---<br />
         at Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
      Value)<br />
         at ExceptionHandlingSampleCode.Module1.ConvertStringAgeToInteger(String
      ageAsString) in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
      16<br />
         at ExceptionHandlingSampleCode.Module1.Main() in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
      7<br />
      --
   </p>
        <p>
      2)
   </p>
        <p>
      We will now modify the above example to add some bad practices and see how the stack
      trace changes.<br />
      --<br />
      Module Module1<br />
          Sub Main()<br />
              Try<br />
                  Dim age As Integer<br />
                  Dim ageAsString
      As String = "a1234"
   </p>
        <p>
                  age = ConvertStringAgeToInteger(ageAsString)<br />
              Catch exception As Exception<br />
                  System.Diagnostics.Debug.WriteLine(exception.ToString)<br />
              End Try<br />
          End Sub
   </p>
        <p>
          Function ConvertStringAgeToInteger(ByVal ageAsString As String)
      As Integer<br />
              Dim age As Integer
   </p>
        <p>
              Try<br />
                  age = CInt(ageAsString)<br />
              Catch
   </p>
        <p>
              End Try<br />
              Return age<br />
          End Function<br />
      End Module<br />
      --
   </p>
        <p>
      There is no output, we have completely ignored/squelched/destroyed the error and error
      information.  The age variable was never set as expected, but we have no way
      of knowing that.
   </p>
        <p>
      3)
   </p>
        <p>
      This is basically the same as above, but we will no longer catch non-.NET exceptions
      (that is the difference between "Catch" and "Catch exception As Exception".<br />
      --<br />
      Module Module1<br />
          Sub Main()<br />
              Try<br />
                  Dim age As Integer<br />
                  Dim ageAsString
      As String = "a1234"
   </p>
        <p>
                  age = ConvertStringAgeToInteger(ageAsString)<br />
              Catch exception As Exception<br />
                  System.Diagnostics.Debug.WriteLine(exception.ToString)<br />
              End Try<br />
          End Sub
   </p>
        <p>
          Function ConvertStringAgeToInteger(ByVal ageAsString As String)
      As Integer<br />
              Dim age As Integer
   </p>
        <p>
              Try<br />
                  age = CInt(ageAsString)<br />
              Catch exception As Exception
   </p>
        <p>
              End Try<br />
              Return age<br />
          End Function<br />
      End Module<br />
      --
   </p>
        <p>
      Again, there is no output for the same reasons as above (the exception is a .NET exception,
      so it is caught and ignored).
   </p>
        <p>
      4)
   </p>
        <p>
      Now we will try to rethrow the exception incorrectly.<br />
      --<br />
      Module Module1<br />
          Sub Main()<br />
              Try<br />
                  Dim age As Integer<br />
                  Dim ageAsString
      As String = "a1234"
   </p>
        <p>
                  age = ConvertStringAgeToInteger(ageAsString)<br />
              Catch exception As Exception<br />
                  System.Diagnostics.Debug.WriteLine(exception.ToString)<br />
              End Try<br />
          End Sub
   </p>
        <p>
          Function ConvertStringAgeToInteger(ByVal ageAsString As String)
      As Integer<br />
              Dim age As Integer
   </p>
        <p>
              Try<br />
                  age = CInt(ageAsString)<br />
              Catch exception As Exception<br />
                  Throw exception<br />
              End Try<br />
              Return age<br />
          End Function<br />
      End Module<br />
      --
   </p>
        <p>
      Here is the output.  The big difference is that instead of line 16 (the call
      to CInt), the stack trace now shows line 19 (the Throw statement).  If the try
      block was 100 lines long, we would have no idea which line in the Try block caused
      the exception.<br />
      --<br />
      System.InvalidCastException: Cast from string "a1234" to type 'Integer' is not valid.
      ---&gt; System.FormatException: Input string was not in a correct format.<br />
         at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value,
      NumberFormatInfo NumberFormat)<br />
         at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value)<br />
         at Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
      Value)<br />
         --- End of inner exception stack trace ---<br />
         at ExceptionHandlingSampleCode.Module1.ConvertStringAgeToInteger(String
      ageAsString) in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
      19<br />
         at ExceptionHandlingSampleCode.Module1.Main() in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
      7<br />
      --
   </p>
        <p>
      5)
   </p>
        <p>
      So, now let's actually try to fix the code using a value of -1 to specify an invalid
      input value.<br />
      --<br />
      Module Module1<br />
          Sub Main()<br />
              Dim age As Integer
   </p>
        <p>
              Try<br />
                  Dim ageAsString
      As String = "a1234"
   </p>
        <p>
                  age = ConvertStringAgeToInteger(ageAsString)<br />
              Catch exception As Exception<br />
                  System.Diagnostics.Debug.WriteLine(exception.ToString)<br />
              End Try
   </p>
        <p>
              System.Diagnostics.Debug.WriteLine("age
      is [" &amp; age &amp; "]")<br />
          End Sub
   </p>
        <p>
          ' If this function returns -1, an error occured<br />
          Function ConvertStringAgeToInteger(ByVal ageAsString As String)
      As Integer<br />
              Dim age As Integer
   </p>
        <p>
              Try<br />
                  age = CInt(ageAsString)<br />
              Catch exception As InvalidCastException<br />
                  age = -1<br />
              End Try<br />
              Return age<br />
          End Function<br />
      End Module<br />
      --
   </p>
        <p>
      Here is the output.  This is workable, but I'd rather see a very useful exception
      thrown than having to check for an error code (error codes are pretty much obsolete
      with .NET, unless you are doing COM Interop).  That brings us back to the very
      first sample code example, which I believe is more correct.  Don't catch exceptions
      unless you can actually do something useful with them!<br />
      --<br />
      age is [-1]<br />
      --
   </p>
        <p>
      --
   </p>
        <p>
      Here is an example of a case where I have found it useful to catch an exception. 
      In .NET 1.1, Integer.Parse will throw one of these three exceptions if the string
      is not parseable.  It would be quite a pain to check for these three exceptions
      every time we wanted to convert a string to an integer, but that is the proper way
      to do it (if you tried to catch a common parent exception, you might accidentally
      catch an OutOfMemoryException or some other exception that you should let bubble up
      to call stack).
   </p>
        <p>
      An interesting note, in .NET 1.1, the Double class is the only one that has a "TryParse"
      method that will parse and return a boolean instead of an exception.  In .NET
      2.0, they addressed this shortcoming.  The Integer class also has a TryParse
      method in .NET 2.0.<br />
      --<br />
      Module Module1<br />
          Sub Main()<br />
              Try<br />
                  If (IsValidInteger(Nothing))
      Then<br />
                     
      System.Diagnostics.Debug.WriteLine("The Integer was valid!")<br />
                  End If<br />
              Catch exception As Exception<br />
                  System.Diagnostics.Debug.WriteLine(exception.ToString)<br />
              End Try<br />
          End Sub
   </p>
        <p>
          Function IsValidInteger(ByVal integerAsString As String) As Boolean<br />
              Try<br />
                  Integer.Parse(integerAsString)<br />
              Catch argumentNullException As ArgumentNullException<br />
                  System.Diagnostics.Debug.WriteLine(argumentNullException.ToString)<br />
                  Return False<br />
              Catch formatException As FormatException<br />
                  System.Diagnostics.Debug.WriteLine(formatException.ToString)<br />
                  Return False<br />
              Catch overflowException As OverflowException<br />
                  System.Diagnostics.Debug.WriteLine(overflowException.ToString)<br />
                  Return False<br />
              End Try<br />
              Return True<br />
          End Function<br />
      End Module<br />
      --<br /></p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=0f98cfe7-7704-494c-bbea-3011ca24a40d" />
      </body>
      <title>On the road to better exception handling</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,0f98cfe7-7704-494c-bbea-3011ca24a40d.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,0f98cfe7-7704-494c-bbea-3011ca24a40d.aspx</link>
      <pubDate>Thu, 27 Jul 2006 11:48:50 GMT</pubDate>
      <description>&lt;p&gt;
   Every client I have done consulting at, without exception (so far), has done exception
   handling incorrectly in .NET.
&lt;/p&gt;
&lt;p&gt;
   This should not be too surprising given that people in VB6 and C++ rarely did exception
   handling right either.
&lt;/p&gt;
&lt;p&gt;
   In .NET (and Java), there are just a few things you have to remember (compared to
   VB6/C++) to do exception handling correctly.&amp;nbsp; Yet in ~5 years of looking for
   these simple rules, I have not yet found them (I discovered them the hard way, by
   maintaining production code that did&amp;nbsp;exception handling&amp;nbsp;incorrectly).
&lt;/p&gt;
&lt;p&gt;
   Here is my attempt at documenting good (and pragmatic) exception handling practices.&amp;nbsp;
   (Microsoft's attempt is here: &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconBestPracticesForHandlingExceptions.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconBestPracticesForHandlingExceptions.asp&lt;/a&gt;)
&lt;/p&gt;
&lt;p&gt;
   These examples are specifically for VB.NET, but they basically apply in the same way
   to Java and C#.
&lt;/p&gt;
&lt;p&gt;
   How not to do it:
&lt;/p&gt;
&lt;p&gt;
   1)
&lt;/p&gt;
&lt;p&gt;
   On Error Resume Next
&lt;/p&gt;
&lt;p&gt;
   What you are doing:&amp;nbsp; You are ignoring *every* error and pretending it never happened
   and continuing execution.&lt;br&gt;
   Why that is bad:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Errors happen for a reason.&amp;nbsp; If you
   aren't even checking to see what error happened, how do you know you can safely continue
   to execute?&amp;nbsp; Continuing execution after an error occurred can easily lead to
   file or database corruption among other problems.
&lt;/p&gt;
&lt;p&gt;
   &lt;br&gt;
   2)
&lt;/p&gt;
&lt;p&gt;
   Try&lt;br&gt;
   &amp;nbsp; ... code here ...&lt;br&gt;
   Catch&lt;br&gt;
   End Try
&lt;/p&gt;
&lt;p&gt;
   What you are doing:&amp;nbsp; You are ignoring *every* error and pretending it never happened
   and continuing execution.&lt;br&gt;
   Why that is bad:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Errors happen for a reason.&amp;nbsp; If you
   aren't even checking to see what error happened, how do you know you can safely continue
   to execute?&amp;nbsp; Continuing execution after an error occurred can easily lead to
   file or database corruption among other problems.
&lt;/p&gt;
&lt;p&gt;
   &lt;br&gt;
   3)
&lt;/p&gt;
&lt;p&gt;
   Try&lt;br&gt;
   &amp;nbsp; ... code here ...&lt;br&gt;
   Catch exception As Exception&lt;br&gt;
   End Try
&lt;/p&gt;
&lt;p&gt;
   What you are doing:&amp;nbsp; You are ignoring *every* .NET Exception and pretending it
   never happened and continuing execution.&lt;br&gt;
   Why that is bad:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Errors happen for a reason.&amp;nbsp; If you
   aren't even checking to see what error happened, how do you know you can safely continue
   to execute?&amp;nbsp; Continuing execution after an error occurred can easily lead to
   file or database corruption among other problems.
&lt;/p&gt;
&lt;p&gt;
   4)
&lt;/p&gt;
&lt;p&gt;
   Try&lt;br&gt;
   &amp;nbsp; ... code here ...&lt;br&gt;
   Catch exception As Exception&lt;br&gt;
   &amp;nbsp; Throw exception&lt;br&gt;
   End Try
&lt;/p&gt;
&lt;p&gt;
   What you are doing:&amp;nbsp; You are resetting the stack trace for the error.&lt;br&gt;
   Why that is bad:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A normal stack trace will show the exact
   line the error originated from.&amp;nbsp; In this scenario, the stack trace will instead
   point the Throw line as the origin of the error.
&lt;/p&gt;
&lt;p&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   Unless you are at the absolute top of the stack (i.e. the main method or a global
   exception handler), you never want to catch exceptions of type "Exception".&amp;nbsp;
   You should only be catching Exception classes that are below Exception in the hierarchy,
   and even more strongly, the leaf nodes of the Exception class hierarchy.
&lt;/p&gt;
&lt;p&gt;
   &lt;br&gt;
   How to do exception handling properly:
&lt;/p&gt;
&lt;p&gt;
   &lt;br&gt;
   1)
&lt;/p&gt;
&lt;p&gt;
   Really, try/catch is better than On Error GoTo, but this example is more for VB6 programmers
   who don't have try/catch.
&lt;/p&gt;
&lt;p&gt;
   On Error GoTo &amp;lt;ExceptionHandler&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
   You need to do all of the following in the Exception Handler:&lt;br&gt;
   (a) Close any open resources (database connections, etc.)&lt;br&gt;
   (b) Check the error/error code&lt;br&gt;
   (c) Check the line that the error occured on&lt;br&gt;
   (d) Put the error (message and stack trace with line numbers) somewhere so someone
   can see it (to the screen, to a log file, to a database, etc.)&lt;br&gt;
   (e) Take appropriate action (i.e. return an error code from the current function,
   exit the application, etc.)
&lt;/p&gt;
&lt;p&gt;
   2)
&lt;/p&gt;
&lt;p&gt;
   Try&lt;br&gt;
   &amp;nbsp; ... code here ...&lt;br&gt;
   Catch exception As SqlException&lt;br&gt;
   &amp;nbsp; Log(exception.ToString, selectStatement)&lt;br&gt;
   &amp;nbsp; Throw&lt;br&gt;
   End Try
&lt;/p&gt;
&lt;p&gt;
   Why is this better:&lt;br&gt;
   You are catching a specific exception class (SqlException) instead of something higher
   level like Exception.&lt;br&gt;
   You are logging the exception to a file, database, e-mail, etc. so a support person
   can log a defect for development to look at.&lt;br&gt;
   You are logging the database SELECT statement that was in use at the time the exception
   occurred.&lt;br&gt;
   You are rethrowing the exception as is so the stack trace will remain intact.
&lt;/p&gt;
&lt;p&gt;
   3)
&lt;/p&gt;
&lt;p&gt;
   Try&lt;br&gt;
   &amp;nbsp; ... code here ...&lt;br&gt;
   Catch innerException As SqlException&lt;br&gt;
   &amp;nbsp; Log(innerException.ToString)&lt;br&gt;
   &amp;nbsp; Throw New CustomException("SQL Statement [" &amp;amp; selectStatement &amp;amp; "]",
   innerException)&lt;br&gt;
   End Try
&lt;/p&gt;
&lt;p&gt;
   Why is this better:&lt;br&gt;
   You are catching a specific exception class (SqlException) instead of something higher
   level like Exception.&lt;br&gt;
   You are logging the exception to a file, database, e-mail, etc. so a support person
   can log a defect for development to look at.&lt;br&gt;
   You are throwing a custom exception that the calling method may be able to deal with
   easier/more successfully than a SqlException.&lt;br&gt;
   You are improving the information available in the exception.&lt;br&gt;
   You are including the innerException so that no information is lost on the new custom
   throw.
&lt;/p&gt;
&lt;p&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   How do deal with third party event driven code:
&lt;/p&gt;
&lt;p&gt;
   If you are using badly behaved third party event driven code, it will sometimes throw
   away useful exception information.
&lt;/p&gt;
&lt;p&gt;
   For example, if you are handling/overriding events thrown by third party code, and
   an exception occurs in your code, that exception should go into the third party code
   and then make it back into your code that originally called the third party code.&amp;nbsp;
   Instead, the third party code may throw away the exception (because they have bad
   exception handling as described above).
&lt;/p&gt;
&lt;p&gt;
   In that case, before you leave your event handler, you need to catch every exception
   and log it so it doesn't get completely lost.&amp;nbsp; You should rethrow it, just in
   case the third party exception handling code is eventually fixed and they propagate
   the exception properly in the future.
&lt;/p&gt;
&lt;p&gt;
   Try&lt;br&gt;
   &amp;nbsp; ... code here ...&lt;br&gt;
   Catch innerException As Exception&lt;br&gt;
   &amp;nbsp; LogToFile("innerException [" &amp;amp; innerException.ToString() &amp;amp; "]")&lt;br&gt;
   &amp;nbsp; Throw New BizException("Exception in event handler for &amp;lt;third party package&amp;gt;
   Code", innerException)&lt;br&gt;
   End Try
&lt;/p&gt;
&lt;p&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   A stack trace is a very important debugging tool.&amp;nbsp; If exceptions are not handled
   properly, stack traces get lost or mangled, making debugging much, much harder.
&lt;/p&gt;
&lt;p&gt;
   Here are some code samples with accompanying stack traces:
&lt;/p&gt;
&lt;p&gt;
   1)
&lt;/p&gt;
&lt;p&gt;
   Here is a fairly simple example that calls a function which causes an exception to
   be thrown.
&lt;/p&gt;
&lt;p&gt;
   This example has no try/catch block in the function, which is normal default behavior.&amp;nbsp;
   The try/catch block in the Main method is just so we can view the exception before
   the application closes and isn't necessary/useful for any other purpose.
&lt;/p&gt;
&lt;p&gt;
   --&lt;br&gt;
   Module Module1&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Main()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ageAsString
   As String = "a1234"
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = ConvertStringAgeToInteger(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(exception.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Function ConvertStringAgeToInteger(ByVal ageAsString As String)
   As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = CInt(ageAsString)
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return age&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br&gt;
   End Module&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   Here is the associated stack trace.&amp;nbsp; It's pretty basic.&amp;nbsp; The DoubleType.Parse
   method threw a FormatException, which was then wrapped and rethrown in the IntegerType.FromString
   method by an InvalidCastException.&amp;nbsp; We don't have the line number in the stack
   trace for the Microsoft.VisualBasic component, but we do have the proper line numbers
   for our code.&amp;nbsp; Line 16 is the call to CInt.&amp;nbsp; Line 7 is the call to ConvertStringAgeToInteger.&lt;br&gt;
   --&lt;br&gt;
   System.InvalidCastException: Cast from string "a1234" to type 'Integer' is not valid.
   ---&amp;gt; System.FormatException: Input string was not in a correct format.&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value,
   NumberFormatInfo NumberFormat)&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value)&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
   Value)&lt;br&gt;
   &amp;nbsp;&amp;nbsp; --- End of inner exception stack trace ---&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
   Value)&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at ExceptionHandlingSampleCode.Module1.ConvertStringAgeToInteger(String
   ageAsString) in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
   16&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at ExceptionHandlingSampleCode.Module1.Main() in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
   7&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   2)
&lt;/p&gt;
&lt;p&gt;
   We will now modify the above example to add some bad practices and see how the stack
   trace changes.&lt;br&gt;
   --&lt;br&gt;
   Module Module1&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Main()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ageAsString
   As String = "a1234"
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = ConvertStringAgeToInteger(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(exception.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Function ConvertStringAgeToInteger(ByVal ageAsString As String)
   As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = CInt(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return age&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br&gt;
   End Module&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   There is no output, we have completely ignored/squelched/destroyed the error and error
   information.&amp;nbsp; The age variable was never set as expected, but we have no way
   of knowing that.
&lt;/p&gt;
&lt;p&gt;
   3)
&lt;/p&gt;
&lt;p&gt;
   This is basically the same as above, but we will no longer catch non-.NET exceptions
   (that is the difference between "Catch" and "Catch exception As Exception".&lt;br&gt;
   --&lt;br&gt;
   Module Module1&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Main()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ageAsString
   As String = "a1234"
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = ConvertStringAgeToInteger(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(exception.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Function ConvertStringAgeToInteger(ByVal ageAsString As String)
   As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = CInt(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return age&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br&gt;
   End Module&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   Again, there is no output for the same reasons as above (the exception is a .NET exception,
   so it is caught and ignored).
&lt;/p&gt;
&lt;p&gt;
   4)
&lt;/p&gt;
&lt;p&gt;
   Now we will try to rethrow the exception incorrectly.&lt;br&gt;
   --&lt;br&gt;
   Module Module1&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Main()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ageAsString
   As String = "a1234"
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = ConvertStringAgeToInteger(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(exception.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Function ConvertStringAgeToInteger(ByVal ageAsString As String)
   As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = CInt(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return age&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br&gt;
   End Module&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   Here is the output.&amp;nbsp; The big difference is that instead of line 16 (the call
   to CInt), the stack trace now shows line 19 (the Throw statement).&amp;nbsp; If the try
   block was 100 lines long, we would have no idea which line in the Try block caused
   the exception.&lt;br&gt;
   --&lt;br&gt;
   System.InvalidCastException: Cast from string "a1234" to type 'Integer' is not valid.
   ---&amp;gt; System.FormatException: Input string was not in a correct format.&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value,
   NumberFormatInfo NumberFormat)&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value)&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
   Value)&lt;br&gt;
   &amp;nbsp;&amp;nbsp; --- End of inner exception stack trace ---&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at ExceptionHandlingSampleCode.Module1.ConvertStringAgeToInteger(String
   ageAsString) in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
   19&lt;br&gt;
   &amp;nbsp;&amp;nbsp; at ExceptionHandlingSampleCode.Module1.Main() in C:\mmaddox\dev\Prototype\ExceptionHandlingSampleCode\Module1.vb:line
   7&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   5)
&lt;/p&gt;
&lt;p&gt;
   So, now let's actually try to fix the code using a value of -1 to specify an invalid
   input value.&lt;br&gt;
   --&lt;br&gt;
   Module Module1&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Main()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ageAsString
   As String = "a1234"
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = ConvertStringAgeToInteger(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(exception.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine("age
   is [" &amp;amp; age &amp;amp; "]")&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; ' If this function returns -1, an error occured&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Function ConvertStringAgeToInteger(ByVal ageAsString As String)
   As Integer&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim age As Integer
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = CInt(ageAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As InvalidCastException&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; age = -1&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return age&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br&gt;
   End Module&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   Here is the output.&amp;nbsp; This is workable, but I'd rather see a very useful exception
   thrown than having to check for an error code (error codes are pretty much obsolete
   with .NET, unless you are doing COM Interop).&amp;nbsp; That brings us back to the very
   first sample code example, which I believe is more correct.&amp;nbsp; Don't catch exceptions
   unless you can actually do something useful with them!&lt;br&gt;
   --&lt;br&gt;
   age is [-1]&lt;br&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   --
&lt;/p&gt;
&lt;p&gt;
   Here is an example of a case where I have found it useful to catch an exception.&amp;nbsp;
   In .NET 1.1, Integer.Parse will throw one of these&amp;nbsp;three exceptions if the string
   is not parseable.&amp;nbsp; It would be quite a pain to check for these&amp;nbsp;three exceptions
   every time we wanted to convert a string to an integer, but that is the proper way
   to do it (if you tried to catch a common parent exception, you might accidentally
   catch an OutOfMemoryException or some other exception that you should let bubble up
   to call stack).
&lt;/p&gt;
&lt;p&gt;
   An interesting note, in .NET 1.1, the Double class is the only one that has a "TryParse"
   method that will parse and return a boolean instead of an exception.&amp;nbsp; In .NET
   2.0, they addressed this shortcoming.&amp;nbsp; The Integer class also has a TryParse
   method in .NET 2.0.&lt;br&gt;
   --&lt;br&gt;
   Module Module1&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Main()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If (IsValidInteger(Nothing))
   Then&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   System.Diagnostics.Debug.WriteLine("The Integer was valid!")&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch exception As Exception&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(exception.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; Function IsValidInteger(ByVal integerAsString As String) As Boolean&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Integer.Parse(integerAsString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch argumentNullException As ArgumentNullException&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(argumentNullException.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return False&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch formatException As FormatException&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(formatException.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return False&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch overflowException As OverflowException&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(overflowException.ToString)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return False&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return True&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br&gt;
   End Module&lt;br&gt;
   --&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=0f98cfe7-7704-494c-bbea-3011ca24a40d" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,0f98cfe7-7704-494c-bbea-3011ca24a40d.aspx</comments>
      <category>Exception Handling Best Practices</category>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=fd6504e0-6de5-45df-b9be-0cc1045aa4de</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,fd6504e0-6de5-45df-b9be-0cc1045aa4de.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,fd6504e0-6de5-45df-b9be-0cc1045aa4de.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=fd6504e0-6de5-45df-b9be-0cc1045aa4de</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      One of my personal pet programming projects at one point in time was to create some
      kind of screen scraper of monster.com and other job websites so I could "download"
      all the current job postings and do things like:
   </p>
        <p>
      1) Rank/Prioritize the job listings by personal appeal<br />
      2) Detect job listing duplicates between monster/dice/etc.<br />
      3) Keep track of which jobs I applied for and when<br />
      4) Automate running multiple queries with multiple terms in job site specific
      ways so I could detect new entries in my areas of interest (something an RSS feed
      would normally be used for)<br />
      5) Categorize jobs by factors that were important to me - Salary, Location, Consulting
      vs. Full-time, How qualified I thought I was, etc.
   </p>
        <p>
      Everyone puts that much effort into their job search, right?  ;)
   </p>
        <p>
      I did get something of an automated process for the worst bits with tons of manual
      intervention required such that I could do this and it worked wonderfully.  It
      was never anywhere close to automated enough to share with friends though.  However,
      screen scrapping different web sites is not fun, rewarding work and I eventually shelved
      the project (and I now find most of my contract work through recruiters who I've talked
      to in the past and never apply for jobs from web site job listings anymore).
   </p>
        <p>
      I still think this is very cool though:
   </p>
        <p>
          <a href="http://www.indeed.com/jsp/apiinfo.jsp">http://www.indeed.com/jsp/apiinfo.jsp</a>
        </p>
        <p>
          <a href="http://www.indeed.com/">Indeed</a> is yet another job search engine, except
      with one major difference (it may not be the only job search engine with this feature,
      but it's the only one I know of).  Indeed publishes a Web Services API which
      you can query directly that seems to return job listings from Monster, Dice, etc. 
      This would have made my pet project above a piece of cake to implement.  This
      is a very good sign of things to come in the web services world!
   </p>
        <p>
      Now if someone would just publish a web service for stock price quotes (you know it's
      going to happen eventually).
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=fd6504e0-6de5-45df-b9be-0cc1045aa4de" />
      </body>
      <title>Programmatic access to job listings on Monster, Dice, etc.</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,fd6504e0-6de5-45df-b9be-0cc1045aa4de.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,fd6504e0-6de5-45df-b9be-0cc1045aa4de.aspx</link>
      <pubDate>Wed, 09 Nov 2005 14:13:21 GMT</pubDate>
      <description>&lt;p&gt;
   One of my personal pet programming projects at one point in time was to create some
   kind of screen scraper of monster.com and other job websites so I could "download"
   all the current job postings and do things like:
&lt;/p&gt;
&lt;p&gt;
   1) Rank/Prioritize the job listings by personal appeal&lt;br&gt;
   2) Detect job listing duplicates between monster/dice/etc.&lt;br&gt;
   3) Keep track of which jobs I applied for and when&lt;br&gt;
   4) Automate running multiple queries&amp;nbsp;with multiple terms in job site specific
   ways so I could detect new entries in my areas of interest (something an RSS feed
   would normally be used for)&lt;br&gt;
   5) Categorize jobs by factors that were important to me - Salary, Location, Consulting
   vs. Full-time, How qualified I thought I was, etc.
&lt;/p&gt;
&lt;p&gt;
   Everyone puts that much effort into their job search, right?&amp;nbsp; ;)
&lt;/p&gt;
&lt;p&gt;
   I did get something of an automated process for the worst bits with tons of manual
   intervention required such that I could do this and it worked wonderfully.&amp;nbsp; It
   was never anywhere close to automated enough to share with friends though.&amp;nbsp; However,
   screen scrapping different web sites is not fun, rewarding work and I eventually shelved
   the project (and I now find most of my contract work through recruiters who I've talked
   to in the past and never apply for jobs from web site job listings anymore).
&lt;/p&gt;
&lt;p&gt;
   I still think this is very cool though:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.indeed.com/jsp/apiinfo.jsp"&gt;http://www.indeed.com/jsp/apiinfo.jsp&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.indeed.com/"&gt;Indeed&lt;/a&gt; is yet another job search engine, except
   with one major difference (it may not be the only job search engine with this feature,
   but it's the only one I know of).&amp;nbsp; Indeed publishes a Web Services API which
   you can query directly that seems to return job listings from Monster, Dice, etc.&amp;nbsp;
   This would have made my pet project above a piece of cake to implement.&amp;nbsp; This
   is a very good sign of things to come in the web services world!
&lt;/p&gt;
&lt;p&gt;
   Now if someone would just publish a web service for stock price quotes (you know it's
   going to happen eventually).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=fd6504e0-6de5-45df-b9be-0cc1045aa4de" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,fd6504e0-6de5-45df-b9be-0cc1045aa4de.aspx</comments>
      <category>Web Services</category>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=08f56f4e-42f3-44df-81d9-b12be9557d98</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,08f56f4e-42f3-44df-81d9-b12be9557d98.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,08f56f4e-42f3-44df-81d9-b12be9557d98.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=08f56f4e-42f3-44df-81d9-b12be9557d98</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.hanselman.com/blog/">Scott Hanselman</a> is great at evaluating
      all the little <a href="http://www.hanselman.com/blog/ScottHanselmans2005UltimateDeveloperAndPowerUsersToolList.aspx">tools
      developers should be using</a>.  <a href="http://www.hanselman.com/blog/PermaLink,guid,38b1a17e-cd44-4284-9fb0-15f1de764bf9.aspx">Yesterday</a>,
      he brought me to <a href="http://stevemiller.net/puretext/">PureText</a>.
   </p>
        <p>
      While not the bane of my existence, the "Paste Special" feature is something I use
      *constantly*.  Unlike hotkey maven Scott, I was doing it with mouse clicks, which
      is even more painful.  Windows-V to "paste special" with one click is *exactly*
      the most important feature I've wanted added to all Microsoft software.  Thank
      you <a href="http://stevemiller.net/">Steve Miller</a>!!!
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=08f56f4e-42f3-44df-81d9-b12be9557d98" />
      </body>
      <title>PureText - Fixing the biggest "bug" in MS Windows/Office/VS.NET</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,08f56f4e-42f3-44df-81d9-b12be9557d98.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,08f56f4e-42f3-44df-81d9-b12be9557d98.aspx</link>
      <pubDate>Tue, 27 Sep 2005 14:12:36 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt; is great at evaluating
   all the little &lt;a href="http://www.hanselman.com/blog/ScottHanselmans2005UltimateDeveloperAndPowerUsersToolList.aspx"&gt;tools
   developers should be using&lt;/a&gt;.&amp;nbsp; &lt;a href="http://www.hanselman.com/blog/PermaLink,guid,38b1a17e-cd44-4284-9fb0-15f1de764bf9.aspx"&gt;Yesterday&lt;/a&gt;,
   he brought me to &lt;a href="http://stevemiller.net/puretext/"&gt;PureText&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   While not the bane of my existence, the "Paste Special" feature is something I use
   *constantly*.&amp;nbsp; Unlike hotkey maven Scott, I was doing it with mouse clicks, which
   is even more painful.&amp;nbsp; Windows-V to "paste special" with one click is *exactly*
   the most important feature I've wanted added to all Microsoft software.&amp;nbsp; Thank
   you &lt;a href="http://stevemiller.net/"&gt;Steve Miller&lt;/a&gt;!!!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=08f56f4e-42f3-44df-81d9-b12be9557d98" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,08f56f4e-42f3-44df-81d9-b12be9557d98.aspx</comments>
      <category>Tools</category>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=d4824071-6144-442a-9494-58247925b67a</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,d4824071-6144-442a-9494-58247925b67a.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,d4824071-6144-442a-9494-58247925b67a.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d4824071-6144-442a-9494-58247925b67a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a id="viewpost.ascx_TitleUrl" href="http://weblogs.asp.net/pwilson/archive/2005/08/10/422112.aspx">ASP.NET
      Simplicity -- When Is Too Much Simplicity a Bad Thing</a>
        </p>
        <p>
      This is a good post to read, plus all the comments.  Many developers have real
      concerns about ASP.NET 2.0 and the direction it's taken.  ASP.NET 1.X is a very
      good product.  I'm really not so sure about ASP.NET 2.0.
   </p>
        <p>
      I'd like to see Microsoft step up to the plate here and instead of saying it's "working
      as designed" say "we are listening to your feedback and we are going to slip the release
      date so we can do it right".
   </p>
        <p>
      I've thought about trying to stick with ASP.NET 1.X, but there are just so many (too
      many?) obstacles.  I can't throw out all of Visual Studio 2005 just because I'm
      not happy with the breaking changes to ASP.NET 2.0.  I really like most of the
      VS 2005 non-ASP.NET 2.0 related changes.  I even like some of the ASP.NET 2.0
      non-breaking changes.
   </p>
        <p>
      I'm sure there are a lot of people watching to see what Microsoft does with this one. 
      Backward compatibility matters.
   </p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=d4824071-6144-442a-9494-58247925b67a" />
      </body>
      <title>More complaining about ASP.NET 2.0</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,d4824071-6144-442a-9494-58247925b67a.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,d4824071-6144-442a-9494-58247925b67a.aspx</link>
      <pubDate>Thu, 11 Aug 2005 22:52:43 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;a id=viewpost.ascx_TitleUrl href="http://weblogs.asp.net/pwilson/archive/2005/08/10/422112.aspx"&gt;ASP.NET
   Simplicity -- When Is Too Much Simplicity a Bad Thing&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
   This is a good post to read, plus all the comments.&amp;nbsp; Many developers have real
   concerns about ASP.NET 2.0 and the direction it's taken.&amp;nbsp; ASP.NET 1.X is a very
   good product.&amp;nbsp; I'm really not so sure about ASP.NET 2.0.
&lt;/p&gt;
&lt;p&gt;
   I'd like to see Microsoft step up to the plate here and instead of saying it's "working
   as designed" say "we are listening to your feedback and we are going to slip the release
   date so we can do it right".
&lt;/p&gt;
&lt;p&gt;
   I've thought about trying to stick with ASP.NET 1.X, but there are just so many (too
   many?) obstacles.&amp;nbsp; I can't throw out all of Visual Studio 2005 just because I'm
   not happy with the breaking changes to ASP.NET 2.0.&amp;nbsp; I really like most of the
   VS 2005 non-ASP.NET 2.0 related changes.&amp;nbsp; I even like some of the ASP.NET 2.0
   non-breaking changes.
&lt;/p&gt;
&lt;p&gt;
   I'm sure there are a lot of people watching to see what Microsoft does with this one.&amp;nbsp;
   Backward compatibility matters.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=d4824071-6144-442a-9494-58247925b67a" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,d4824071-6144-442a-9494-58247925b67a.aspx</comments>
      <category>Visual Studio 2005</category>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=a704da21-8057-4e19-a25f-fa82ae26dd18</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,a704da21-8057-4e19-a25f-fa82ae26dd18.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,a704da21-8057-4e19-a25f-fa82ae26dd18.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=a704da21-8057-4e19-a25f-fa82ae26dd18</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      As a Windows user, running applications from the command line is a major pain in the
      ass (if I preferred working from the command line, I would use Linux).  Yet,
      with NAnt, there is little choice but to open a command prompt.  Well, there
      is an open source project called <a href="http://nantrunner.sourceforge.net/">NAntRunner</a> that
      allows you to run NAnt from a VS.NET Add-In, but that doesn't look like what I want
      either as I often have to close VS.NET to allow NAnt to overwrite the DLLs VS.NET
      has locked (I believe this is a bug in VS.NET) and if I want to build a single solution,
      I just do that in the normal VS.NET way anyway.
   </p>
        <p>
      So, I often open a command prompt, run a batch file to add nant.exe to my path (I
      intentionally change my path and other environment variables in an environment specific
      batch file so I'm sure to always grab the proper version of the applications for that
      particular development/build environment) and then start cd'ing around to different
      directory to run the minimal set of NAnt targets I need to get the job done.
   </p>
        <p>
      So, I did a google search for how to add a right click "Open Command Prompt Here"
      to Windows File Explorer, so I can at least start the command prompt in an arbitrary
      directory quickly and easily.  There are some excellent options for this feature <a href="http://www.petri.co.il/add_command_prompt_here_shortcut_to_windows_explorer.htm">here</a>. 
      I chose option 3 as it was simple and low risk (I can easily undo it - there is no
      "magic").
   </p>
        <p>
      This makes running NAnt that much more tolerable, but I think what I really want is
      a Windows File Explorer Add-In to run NAnt for an arbitrary target in an arbitrary
      environment, running an arbitrary batch file to initialize the environment first. 
      It seems very doable, but just doesn't interest me enough to actually implement it.
   </p>
        <p>
      And why does a google search for "<a href="http://www.google.com/search?hl=en&amp;lr=&amp;q=%22NAnt+Runner%22">NAnt
      Runner</a>" (notice the subtle space between the words) return nothing useful? 
      Hmm...  <a href="http://search.msn.com/results.aspx?q=%22NAnt+Runner%22">MSN
      search</a> would have at least gotten me where I needed to go with a couple of non-obvious
      clicks, but there still isn't a direct link on the first page of results.  Not
      that I have much search engine power, but I'm going create this link anyway in hopes
      that it helps other people: <a href="http://nantrunner.sourceforge.net/">NAnt Runner</a>.<br /></p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=a704da21-8057-4e19-a25f-fa82ae26dd18" />
      </body>
      <title>Running NAnt from the Command Prompt in an arbitrary directory</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,a704da21-8057-4e19-a25f-fa82ae26dd18.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,a704da21-8057-4e19-a25f-fa82ae26dd18.aspx</link>
      <pubDate>Fri, 05 Aug 2005 10:36:34 GMT</pubDate>
      <description>&lt;p&gt;
   As a Windows user, running applications from the command line is a major pain in the
   ass (if I preferred working from the command line, I would use Linux).&amp;nbsp; Yet,
   with NAnt, there is little choice but to open a command prompt.&amp;nbsp; Well, there
   is an open source project called &lt;a href="http://nantrunner.sourceforge.net/"&gt;NAntRunner&lt;/a&gt; that
   allows you to run NAnt from a VS.NET Add-In, but that doesn't look like what I want
   either as I often have to close VS.NET to allow NAnt to overwrite the DLLs VS.NET
   has locked (I believe this is a bug in VS.NET) and if I want to build a single solution,
   I just do that in the normal VS.NET way anyway.
&lt;/p&gt;
&lt;p&gt;
   So, I often open a command prompt, run a batch file to add nant.exe to my path (I
   intentionally change my path and other environment variables in an environment specific
   batch file so I'm sure to always grab the proper version of the applications for that
   particular development/build environment) and then start cd'ing around to different
   directory to run the minimal set of NAnt targets I need to get the job done.
&lt;/p&gt;
&lt;p&gt;
   So, I did a google search for how to add a right click "Open Command Prompt Here"
   to Windows File Explorer, so I can at least start the command prompt in an arbitrary
   directory quickly and easily.&amp;nbsp; There are some excellent options for this feature &lt;a href="http://www.petri.co.il/add_command_prompt_here_shortcut_to_windows_explorer.htm"&gt;here&lt;/a&gt;.&amp;nbsp;
   I chose option 3 as it was simple and low risk (I can easily undo it - there is no
   "magic").
&lt;/p&gt;
&lt;p&gt;
   This makes running NAnt that much more tolerable, but I think what I really want is
   a Windows File Explorer Add-In to run NAnt for an arbitrary target in an arbitrary
   environment, running an arbitrary batch file to initialize the environment first.&amp;nbsp;
   It seems very doable, but just doesn't interest me enough to actually implement it.
&lt;/p&gt;
&lt;p&gt;
   And why does a google search for "&lt;a href="http://www.google.com/search?hl=en&amp;amp;lr=&amp;amp;q=%22NAnt+Runner%22"&gt;NAnt
   Runner&lt;/a&gt;" (notice the subtle space between the words) return nothing useful?&amp;nbsp;
   Hmm...&amp;nbsp; &lt;a href="http://search.msn.com/results.aspx?q=%22NAnt+Runner%22"&gt;MSN
   search&lt;/a&gt; would have at least gotten me where I needed to go with a couple of non-obvious
   clicks, but there still isn't a direct link on the first page of results.&amp;nbsp; Not
   that I have much search engine power, but I'm going create this link anyway in hopes
   that it helps other people: &lt;a href="http://nantrunner.sourceforge.net/"&gt;NAnt Runner&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=a704da21-8057-4e19-a25f-fa82ae26dd18" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,a704da21-8057-4e19-a25f-fa82ae26dd18.aspx</comments>
      <category>Knowledge Base</category>
    </item>
    <item>
      <trackback:ping>http://www.capprime.com/software_development_weblog/Trackback.aspx?guid=4b76ee80-7330-4734-9a0e-436dbccc4e32</trackback:ping>
      <pingback:server>http://www.capprime.com/software_development_weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.capprime.com/software_development_weblog/PermaLink,guid,4b76ee80-7330-4734-9a0e-436dbccc4e32.aspx</pingback:target>
      <dc:creator>Michael.P.Maddox@gmail.com (Michael Maddox)</dc:creator>
      <wfw:comment>http://www.capprime.com/software_development_weblog/CommentView,guid,4b76ee80-7330-4734-9a0e-436dbccc4e32.aspx</wfw:comment>
      <wfw:commentRss>http://www.capprime.com/software_development_weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4b76ee80-7330-4734-9a0e-436dbccc4e32</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Migrating from ASP.NET 1.1 to 2.0 can be quite a disturbing experience, at least it
      has been for me.  You must go through a major (mostly automated) conversion process
      to recompile your application for 2.0.  Most every one of your source files will
      be modified during conversion, so there isn't really an option of "going back" or
      developing a code base against both 1.1 and 2.0 in parallel (although I still hope
      to attempt this parallel track, it will require tremendous attention to detail and
      custom automation).
   </p>
        <p>
      I wish I had read this document from Microsoft before I did the migration for the
      first time so I wouldn't have been so shocked and horrified at what the conversion
      wizard did to my code:
   </p>
        <p>
          <a href="http://msdn.microsoft.com/asp.net/migration/upgrade/default.aspx?pull=/library/en-us/dnaspp/html/upgradingaspnet.asp">Common
      ASP.NET 2.0 Conversion Issues and Solutions</a>
        </p>
        <p>
      I highly recommend you at least skim it before attempting the conversion to get a
      vague idea of what you are in for.  Running the conversion wizard the first time
      for me caused major problems because of my unrealistic expectations about what I was
      in for.  My first 3 options for restoring a backup copy of my 1.1 project and
      source failed for unfortunate reasons, but luckily I had a 4th backup option that
      I could restore from.  Lesson learned: You can't have enough backups before running
      the conversion wizard (it's hard to fault Microsoft too much for my near miss, but
      there are a couple of things they could have done differently that would have saved
      me quite a bit of grief).
   </p>
        <p>
      Microsoft has more on migrating from ASP.NET 1.1 to 2.0 here:<br /><a href="http://msdn.microsoft.com/asp.net/migration/upgrade/default.aspx">http://msdn.microsoft.com/asp.net/migration/upgrade/default.aspx</a></p>
        <p>
          <br />
      [via <a href="http://www.larkware.com/dg3/TheDailyGrind675.html">The Daily Grind</a>]<br /></p>
        <img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=4b76ee80-7330-4734-9a0e-436dbccc4e32" />
      </body>
      <title>Migrating from ASP.NET 1.1 to 2.0</title>
      <guid>http://www.capprime.com/software_development_weblog/PermaLink,guid,4b76ee80-7330-4734-9a0e-436dbccc4e32.aspx</guid>
      <link>http://www.capprime.com/software_development_weblog/PermaLink,guid,4b76ee80-7330-4734-9a0e-436dbccc4e32.aspx</link>
      <pubDate>Wed, 27 Jul 2005 21:19:09 GMT</pubDate>
      <description>&lt;p&gt;
   Migrating from ASP.NET 1.1 to 2.0 can be quite a disturbing experience, at least it
   has been for me.&amp;nbsp; You must go through a major (mostly automated) conversion process
   to recompile your application for 2.0.&amp;nbsp; Most every one of your source files will
   be modified during conversion, so there isn't really an option of "going back" or
   developing a code base against both 1.1 and 2.0 in parallel (although I still hope
   to attempt this parallel track, it will require tremendous attention to detail and
   custom automation).
&lt;/p&gt;
&lt;p&gt;
   I wish I had read this document from Microsoft before I did the migration for the
   first time so I wouldn't have been so shocked and horrified at what the conversion
   wizard did to my code:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://msdn.microsoft.com/asp.net/migration/upgrade/default.aspx?pull=/library/en-us/dnaspp/html/upgradingaspnet.asp"&gt;Common
   ASP.NET 2.0 Conversion Issues and Solutions&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   I highly recommend you at least skim it before attempting the conversion to get a
   vague idea of what you are in for.&amp;nbsp; Running the conversion wizard the first time
   for me caused major problems because of my unrealistic expectations about what I was
   in for.&amp;nbsp; My first 3 options for restoring a backup copy of my 1.1 project and
   source failed for unfortunate reasons, but luckily I had a 4th backup option that
   I could restore from.&amp;nbsp; Lesson learned: You can't have enough backups before running
   the conversion wizard (it's hard to fault Microsoft too much for my near miss, but
   there are a couple of things they could have done differently that would have saved
   me quite a bit of grief).
&lt;/p&gt;
&lt;p&gt;
   Microsoft has more on migrating from ASP.NET 1.1 to 2.0 here:&lt;br&gt;
   &lt;a href="http://msdn.microsoft.com/asp.net/migration/upgrade/default.aspx"&gt;http://msdn.microsoft.com/asp.net/migration/upgrade/default.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;br&gt;
   [via &lt;a href="http://www.larkware.com/dg3/TheDailyGrind675.html"&gt;The Daily Grind&lt;/a&gt;]&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.capprime.com/software_development_weblog/aggbug.ashx?id=4b76ee80-7330-4734-9a0e-436dbccc4e32" /&gt;</description>
      <comments>http://www.capprime.com/software_development_weblog/CommentView,guid,4b76ee80-7330-4734-9a0e-436dbccc4e32.aspx</comments>
      <category>Visual Studio 2005</category>
    </item>
  </channel>
</rss>