<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx</link><description>I had hoped this article would be on changes to the next version of the CLR which allow it to be hosted inside SQL Server and other “challenging” environments. This is more generally interesting than you might think, because it creates an opportunity</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51525</link><pubDate>Wed, 01 Oct 2003 21:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51525</guid><dc:creator>haacked</dc:creator><description>Are they hiring?</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51526</link><pubDate>Thu, 02 Oct 2003 00:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51526</guid><dc:creator>Anonymous</dc:creator><description>Dude you really need to write a book!</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51527</link><pubDate>Thu, 02 Oct 2003 04:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51527</guid><dc:creator>Mathew Nolton</dc:creator><description>Chris, I enjoy blogging but I barely find the time to do it. How do you find the time to write small dissertations? ;) Nice article as always. I plan on reading it in detail later.
-Mathew Nolton</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51528</link><pubDate>Thu, 02 Oct 2003 04:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51528</guid><dc:creator>Robert Hurlbut</dc:creator><description>Excellent article, as always!  Thank you for discussing briefly how Thread.Abort interacts with the JIT.  I, for one, am interested in the undeniable exception propagation (Thread.Abort) as I have fought the ThreadAbortException problem before.  I have seen it documented in the Rotor (SSCLI) code, and tried to understand what was going on and why.  </description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51529</link><pubDate>Thu, 02 Oct 2003 04:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51529</guid><dc:creator>Anonymous</dc:creator><description>Aww, we have to get hired to learn more? Seems a bit over the top to have to move to the states just to learn about exceptions. :)

Keep the articles long I say. Readers can always skim them if they don't want to know the details, but if you do want to know the details and there's only a short article, you're out of luck. Better too long than too short.
</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51530</link><pubDate>Thu, 02 Oct 2003 10:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51530</guid><dc:creator>Jeroen</dc:creator><description>I agree with the previous poster. I can find the general facts in the MSDN docs, blogs like these are great for getting the gritty details when you really want to know how something works. Thanks alot for writing stuff like this!</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51531</link><pubDate>Thu, 02 Oct 2003 12:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51531</guid><dc:creator>Jeroen Frijters</dc:creator><description>&amp;gt; I should write shorter blogs.

Please don't!

Your going to love my exception handling in IKVM.NET (not!). I think I violate all of the best practices.

Since Java compiles try { } finally {} as try {} catch() {} (and also allows returning from a finally block), I cannot use (at least it would be difficult) the CLR finally construct.

I also create way too many exception handlers, because in Java it is legal to branch in to and out of exception handlers, so I have to split them. For a particularly nasty example, check out http://www.frijters.net/run.il

(the Java source is at: http://www.frijters.net/run.txt)
</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51532</link><pubDate>Thu, 02 Oct 2003 17:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51532</guid><dc:creator>John Cavnar-Johnson</dc:creator><description>Don't waste any time trying to make your blogs shorter.  The information density in your entries is the highest I've ever seen.  There is no fluff to be cut.  You are tackling complex issues at an incredibly detailed level and you have an excellent sense for what a single entry should be.  You could conceivably divide this article at your section headings, but what's the point?  One of the benefits of blogging is that there are no artificial constraints on length (unlike a book or an MSDN article).

I was an English major in college and an editor before becoming a software geek. Very few technical writers (even with good editors) can achieve the kind of clarity I see in your articles.  Your target audience is small, but it is one that is very important to the success of .NET.  </description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51533</link><pubDate>Thu, 02 Oct 2003 20:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51533</guid><dc:creator>Frank Hileman</dc:creator><description>Please keep the long blogs. I don't think any of your readers want shorter ones. Your internal reviewers were probably thinking of a different kind of audience.

Your comments on the cost of exception throw/catch has reinforced my feeling that exceptions are are too frequently being recommended as an alternative to return values. I have seen how exception catching can bog down applications.

I think that when designing a commonly used API, an exception should not be thrown when performing an operation, if there is no alternative way to determine that the exception will be thrown. That is, throwing an exception when passed a null reference is acceptable, because the caller can easily check for a null reference. But if an algorithm within a function throws an exception, and there is no way to pre-determine the exception will be thrown, without the API user duplicating the algorithm externally, an alternative, non-exception throwing function should be provided, or a return value should communicate failure instead. It is impossible for the API designer to predict the context in which the function will be used, and how often the exception may be thrown.

Brad Adams started some discussions like this here:
http://blogs.gotdotnet.com/brada/commentview.aspx/c9c61dbf-62a9-474f-a5fe-c171cdedb4f6</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51534</link><pubDate>Thu, 02 Oct 2003 21:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51534</guid><dc:creator>Sean McLeod</dc:creator><description>On the topic of buffer overruns on the stack and getting code to execute from the stack, how come Intel haven't added an option in their newer CPUs to allow the OS to mark the stack VM pages with Read/Write permission but 'No Execute' permission?</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51535</link><pubDate>Fri, 03 Oct 2003 09:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51535</guid><dc:creator>Steve</dc:creator><description>Excellent article Chris - complete with a flashback or two from the past (I tried a 'Jonny Mnemonic' erasure on WinNT SEH)

Thanks!</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51536</link><pubDate>Fri, 03 Oct 2003 09:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51536</guid><dc:creator>Steve</dc:creator><description>Excellent article Chris - complete with a flashback or two from the past (I tried a 'Jonny Mnemonic' erasure on WinNT SEH)

Thanks!</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51537</link><pubDate>Fri, 03 Oct 2003 16:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51537</guid><dc:creator>Mike Dimmick</dc:creator><description>Sean: about Intel (i.e. x86) CPUs.

Firstly, I don't think there's room in the page table entry for an additional flag, you'd have to persuade the other manufacturers to do it too, and obviously this would only help on new processors (which the OS would have to detect correctly). IIRC, Windows already uses all three bits (11 to 9) of the page table entry for its own purposes - although I'd have to check _Inside Windows 2000_ to be sure.

The x86 processor only executes code through the memory pointed to by the code segment register, but a segment can only be a contiguous region of virtual memory - it can't consist of multiple non-contiguous regions. Existing programs expect not to have to manipulate the CS register; Windows currently sets all the segment registers apart from FS to point to segments with appropriate permissions set, but which address all 4GB of virtual memory (i.e. offset = 0, size = 0xFFFFFFFF). As Chris said, the FS register points to the Thread Information Block (actually, it points to an entry in the Segment Descriptor Table which describes a segment whose starting offset is the start address of the TIB). The FS register is the only segment register which gets used by typical Windows application code. Everything else is referenced by its default selector - all code is accessed through the CS selector, data through DS, stack through SS and string-destinations (for string-copy instructions such as MOVS) through ES. AMD64 ignores CS, DS, ES and SS in 64-bit mode; FS and GS still exist and are widened to reference a 64-bit base address, although the limit is now ignored.

The new processor architectures, AMD64 and IA64, both permit execute/no execute permissions to be set on a per-page basis.

Also, some libraries use areas of the stack for thunk code. I'm thinking particularly of ATL 6.0, which uses a dynamically-generated thunk as the actual window procedure passed to Windows. The thunk replaces the hWnd argument with the 'this' pointer of the referenced object, then calls the class's static WindowProc function. Since the thunk is declared as a member of CWindowImplRoot, if you allocate a window object on the stack (perhaps for a modal dialog), you end up with the thunk on the stack requiring execute permissions.

I note that in ATL 7.x for x86, the thunk will actually now be allocated in the process's default heap rather than on the stack, although it's still on the stack for other processors. See ATLWIN.H for CWndProcThunk and ATLBASE.H for CStdCallThunk (ATL 7.x only).</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51538</link><pubDate>Fri, 03 Oct 2003 17:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51538</guid><dc:creator>Erick Sgarbi</dc:creator><description>&amp;quot; I should write shorter blogs&amp;quot;
Well, I believe Lincoln has said once, &amp;quot;I did not have time to write you a short message so I merely wrote a long one&amp;quot; which means that takes time to write something short and meaniful. I am sure you're a very busy person yourself, which is taking your own private time to speak your mind and helping all of us (CLR wolves) to understand better this machinery. 

Put this way, if you take your time to write a very long article I will ensure to make myself time to read it full.

Great work!
</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51539</link><pubDate>Sat, 04 Oct 2003 23:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51539</guid><dc:creator>Sean McLeod</dc:creator><description>x86 no-execute VM pages.

Yes it would only apply to newer cpus, but at 100 million plus new PCs per year the sooner it got in the more useful it would be. 

In terms of some code like ATL actually generating executable code on the stack etc. the option is to allow it to be an option per process so that a minimum 'critical' processes hosting things like rpcss etc. could run with this extra level of safety.

Does anyone know whether the 64 bit versions of Windows use the execute permission bit to prevent the execution of code from certain pages under any circumstances?

Cheers

</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51540</link><pubDate>Sun, 05 Oct 2003 00:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51540</guid><dc:creator>Chris Brumme</dc:creator><description>I agree that taking advantage of &amp;quot;No Execute&amp;quot; pages on modern CPUs is essentially a no-brainer, in light of the current (and future) security environment.  If I had to guess, it would be more a matter of when rather than if.  Obviously a lot of software would have to change before we could support this broadly.  For instance, the CLR itself is loaded into a lot of processes.  And on X86 the CLR executes out of random heap blocks.  I wouldn't be surprised to find that we execute out of the stack in some cases, also.  But we already needed to clean this up for 64-bit, so the incremental work for 32-bit may not be too bad.</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51541</link><pubDate>Sun, 05 Oct 2003 00:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51541</guid><dc:creator>Chris Brumme</dc:creator><description>It's hard to know whether the question &amp;quot;Are they hiring?&amp;quot; was serious.  Generally, Microsoft is always hiring.  And I think the CLR team has had a couple of open head count pretty constantly for many years.  The actual jobs change over time, between the different sub-teams (security, debugging, perf, etc.) and the different disciplines (dev, architect, mgmt, tester &amp;amp; pm).  I suspect we're a bit more rigorous &amp;amp; painful on our interviews than the typical Microsoft team.  But if you are really serious about a job on the CLR, by all means email me directly.  (If you can't decode my email address from the NOSPAM version, you've already failed the first test!)</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51542</link><pubDate>Wed, 08 Oct 2003 20:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51542</guid><dc:creator>Rick Byers</dc:creator><description>Another excellent paper Chris!  I agree you shouldn't worry about making them any shorter.  People are used to reading short blog entries, but I see your posts more like journal articles/papers.  I print them out and read them during my commute, instead of reading them on-line like other blogs.  You should definitely consider collecting your posts into book form at some point!

&amp;gt; But in a managed world, ‘const’ would only have value if it were enforced by the CLR.

I disagree.  Sure there would be incredible value in having the CLR enforce const-ness, but as you say the cost-benefit tradeoff is too high for the average case.  However, I believe there would also be incredible value in having unverified const method parameters that are checked only at compile time.  

Generally, during development the caller of a method needs to know if the reference types being pased into the method will be modified in any way.   For example, if they’re going to be modified, the caller may not be able to re-use it next time the current operation needs to be performed.  More generally, knowing when objects are modified and when they're not (or aren't supposed to be) is necessary to keep track of the state of an algorithm.  

Today in .NET, this is specified in the API documentation.  For example, the static method Array.Clear indicates the Array argument is modified, but Array.BinarySearch implies its argument is not.  Of course the description of the method usually makes it clear, but that's not always the case.  It’s also common, even in high quality API references like the .NET MSDN docs, for the documentation to omit this detail.

Since the programmer needs to know this information when manipulating the code, why not make the documentation explicit with machine-readable meta-data?  If I declare some method 'void Foo( const MyType m )', I'm just saying that Foo doesn't intend to modify the state of m.  If I change my mind later and decide I am going to modify 'm', I'd like some automated way to determine (within my application) which of my callers are relying on the previous behaviour.  With compile-time verified 'const', any such callers would now get a compiler error (or even just a warning).  Of course, I'm not advocating semantic changes to an API once its in a production environment where versioning is an issue.  But during development and refactoring, it’s incredibly important to be able to identify the call sites that will be affected by a semantic change.  I've seen many developers '#if false' out a method (or apply System.ObsoleteAttribute) just to accurately find all the static references to the method within the solution (VS.NET's 'Go to Reference' is horribly inadequate here) - but that’s a much bigger problem.

My point is just that many people find 'const' useful in C++, despite the fact it’s not enforced.  The C++ standard says that the results of using const_cast&amp;lt;&amp;gt; are implementation-defined, but in my experience implementations intentionally allow the use of const_cast without any side effects, specifically because people use it as I've described.  Many people that make religious use of 'const' in C++ find it to be a useful tool in API design and bug prevention. 

Here is a great example of the problem that has actually caused me real grief in the distributed-computing platform I work on (http://www.kinitos.com/).  I had code something like this (simplified for demonstration purposes):

IClientChannelSinkProvider ccsp = new BinaryClientFormatterSinkProvider();
ccsp.Next = new MyCustomProvider();
if( &amp;lt;we need a Tcp channel&amp;gt; ) {
  channel = new TcpChannel( properties, ccsp, null );
  RegisterChannel( channel );
}

if( &amp;lt;we need an Http channel&amp;gt; ) {
  channel = new HttpChannel( properties, ccsp, null );
  RegisterChannel( channel );
}

This code works great if we're creating EITHER a TcpChannel or an HttpChannel.  However, if we need both channels, we'll get a run-time exception creating the HttpChannel because the TcpChannel constructor modified my sink provider chain (appended a TcpClientTransportSinkProvider).  The TcpChannel documentation doesn't indicate the IClientChannelSinkProvider argument will be modified.  I actually had to decompile System.Runtime.Remoting.dll (or look at the SSCLI - I forget which) to fully understand the problem here.  Had C# supported const, I would have written the first 2 lines as:

IClientChannelSinkProvider newCcsp = new BinaryClientFormatterSinkProvider();
newCcsp.Next = new MyCustomProvider();
const IClientChannelSinkProvider ccsp = newCcsp;

And then, if the framework made use of 'const', I would have gotten a compiler error passing a 'const IClientChannelSinkProvider' to the TcpChannel constructor, and realized the problem right away.

This functionality could even be added to the language in a backwards compatible way using attributes on the method parameters.  The compiler could default to not checking const, but allow checking to be enabled.  Perhaps only calls to classes/assemblies marked with [UsesConst] would be checked, or there would be both a [const] and [notconst] attribute.  This would allow a project to benefit internally from the functionality, without requiring the entire .NET framework be updated with 'const' attributes.

I've always justified the C# team's decision to not support const by telling myself that it would probably provoke confusion because some developers would assume it was runtime-verified and end up introducing security problems.  However, I don't really believe this argument is sufficient.  Some developers are surprised that fully trusted code can use reflection to access private members.  In reality if you're writing a trusted library whose clients may be untrusted and hostile you're going to need a much stronger understanding of .NET security to get it right and are unlikely to make such a simple mistake.  

I would take this whole argument even further and say that compilers and languages could be doing a lot more to support compile-time and run-time contract verification, and that it would improve our ability to write robust and reliable software. 

Am I missing something here Chris?  Is there some other reason I haven't thought of that the C# team decided not to support compile-time verified const method parameters?

Sorry for the long post.  As I said, this is a religious issue &amp;lt;grin&amp;gt;.  Keep up the awesome work!  
</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51543</link><pubDate>Thu, 09 Oct 2003 02:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51543</guid><dc:creator>Zohar</dc:creator><description>&amp;gt;&amp;gt;(IErrorInfo anybody?)
No thanks , I've just eaten...
</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51544</link><pubDate>Fri, 10 Oct 2003 16:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51544</guid><dc:creator>Chris Brumme</dc:creator><description>Rick,

There actually is an unenforced notion of 'const' available for compilers to share.  Look at IsConstModifier in Microsoft.VisualC.dll.  MC++ uses this as you would expect.  For example, if you dump System.EnterpriseServices.Thunk.dll you will see it applied to static fields, pointers, and other parts of signatures.  The CLR only uses these custom signature modifiers for binding / overload purposes.

I actually think there's a real risk with providing features like this without CLR enforcement.  Or -- in the case of 'initonly', which is 'readonly' in C# -- providing features where the CLR enforces something different from what a developer might expect.  During our V1 security push, we found many many examples where our framework developers had misinterpreted a C# compiler enforcement for a CLR enforcement and had erroneously built those assumptions into their security model.  In some cases, we scrambled to add CLR enforcement at the end of V1.  In other cases, we used FxCop and detailed source audits to remove those erroneous assumptions.

For me, this was a real eye opener.  The FX developers are very sophisticated.  But it's just too easy to confuse language model restrictions with execution model restrictions.</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51545</link><pubDate>Mon, 13 Oct 2003 19:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51545</guid><dc:creator>Mark Morrell</dc:creator><description>Chris -

I'm completely changing the subject on you.  You started this article with:

----8&amp;lt;----

I had hoped this article would be on changes to the next version of the CLR which allow it to be hosted inside SQL Server and other “challenging” environments.  This is more generally interesting than you might think, because it creates an opportunity for other processes (i.e. your processes) to host the CLR with a similar level of integration and control.

----8&amp;lt;----

I'm about to embark on a significant development project, and right now am considering C#.  Do you have any sort of criteria to decide what sorts of project should or should not run in the CLR?  For instance, I would not expect MS Word, Excel, etc. to be written in C#.  How do you decide?

Also, do you know whether Microsoft is going to continue the older C++ environment?  Assuming Microsoft continues to write non .NET software, will the older development platform continue to evolve and be supported?

(And I'll throw my vote in with the others.  Keep 'em long.  Cutting them shorter would only detract from their value.)</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51546</link><pubDate>Tue, 14 Oct 2003 11:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51546</guid><dc:creator>Mark Hurd</dc:creator><description>Mark Morrell: If I were starting Word or Excel from scratch VB.NET would be my language of choice. Sure some specific issues (performance, interop, etc) may arise that causes some other .NET language to be used for parts but VB is still the best at doing visual things in Windows.
</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51547</link><pubDate>Thu, 16 Oct 2003 22:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51547</guid><dc:creator>Chris Brumme</dc:creator><description>I'm highly biased here.  Long term, I would like to see managed code as the basis of Visual Studio, Office, device drivers and even the OS kernel.  That's a very long term.  You shouldn't be making your current product plans based on what we hope eventually to support.  It's hard for me to comment specifically on your application without some details.  If you want to email me with those details, feel free.

As for the language choice, I'm biased there too.  I personally like C# because I have a long background with C and C++.  I sometimes get frustrated that C# won't let me do some of the obscure things the CLR supports.  But I think they struck an excellent balance between a clean powerful language that has most of the dangerous edges removed.  If I had a background with VB instead of C, I suspect I would be telling you something different.

</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51548</link><pubDate>Wed, 22 Oct 2003 19:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51548</guid><dc:creator>Rick Byers</dc:creator><description>Thanks for the response Chris, I see your point and the insight into the FX team is valuable.  I probably underestimate how easy it would be to fall into that trap (need that 'pit of success').  Although I still think that if const violation was just a compiler warning (instead of an error), it would be harder for developers to think it was runtime enforced.

Perhaps we need some kind of contract meta-information (eg. specified in the XML comments of a method) that could be verified outside the compiler (perhaps with a tool like FxCop).  It just seems like a wasted opportunity to me to have significant aspects of a types contract specified only in non-machine readable form (i.e. in the documentation), where is can't be verified automatically.  This applies to much more than just const (my personal favourite topic is concurrency - its way too easy to have deadlock potential in a large concurrent C#/VB/C++/Java program).</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51549</link><pubDate>Thu, 23 Oct 2003 07:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51549</guid><dc:creator>Chris Brumme</dc:creator><description>I'm a huge believer in developer-authored statements about the semantics of their programs, particularly if there can be some level of automated checking of these statements.  I agree with you that concurrency is a natural area to apply this sort of thing.  Personally, I would like to see Eiffel-style pre-, post-conditions and invariants which can be selectively enabled.  In the case of concurrency, locks could be ranked to avoid deadlocks.  Recursion could be prevented with extra checks (on most locks).

We've been looking at other places we could apply this sort of mechanism.  I think it's a ripe area for innovation both inside and outside Microsoft.  But it's important to avoid any confusion over whether these statements are runtime-enforced and therefore whether they can be a solid basis for building security.</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51550</link><pubDate>Tue, 28 Oct 2003 19:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51550</guid><dc:creator>Chris Dern</dc:creator><description>Are you comming ( here ) to the PDC? Ask the Experts?</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51551</link><pubDate>Thu, 20 Nov 2003 23:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51551</guid><dc:creator>David Levine</dc:creator><description>I don't know if you still monitor these old sites once you generate a new blog but I'll take a chance and hope you do and feel like answering one simple question. 

I was just wondering how the runtime handled simple try-finally semantics (no catch block). I know that the underlying OS traps an exception, propagates it to user level via the debugger ports (1st chance exception), to the app, etc. And then MSVC exposes try-finally and try-except semantics, and then the runtime maps those into the C# exception mechanism.

I ask because I've seen a lot of references in documents, including here, about how expensive exception handling is in terms of performance and that the ratio of try-finally blocks to try-catch block should be on the order of 10:1. 

I would expect it would be easier (and far more consistent) to use the same mechanism for implementing try-finally semantics as is done for try-catch, but since this would involve round-tripping through the kernel (which would mean that all finallys are non-local) I thought that perhaps the runtime handled it differently, perhaps by directly running the chain of handlers via manipulating the FS:[0] register and stepping through the EXCEPTION_REGISTRATION records.

If the runtime does use the OS to unwind the stack then where is the performance gain? It would still run the chain of frame-based handlers (twice - the second for finally semantics); the only gain I can think of is that the runtime would not need to generate a stack trace.

Are there games played where if the execution stream reaches a known &amp;quot;good&amp;quot; point it knows it can execute the finally block and then JMPs directly to that code?

What am I missing here? Thanks.

Dave

</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51552</link><pubDate>Sat, 22 Nov 2003 19:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51552</guid><dc:creator>Chris Brumme</dc:creator><description>I think your question is about try/finally in a stack fragment that's made up entirely of managed activation records.  In that case, there's only a single SEH handler which guards all the managed code.  So we participate with the OS SEH mechanism in order to get first and second pass notifications to that single SEH handler.  But then we do our own thing (on X86) while distributing the notification to the managed exception constructs within that range of managed code.

Having said that, even in managed code on X86 where we can avoid the burden of SEH on every method, the cost of processing an exception remains high.  I suspect that at some point we will do some work to make it faster.  We have a number of ideas here.  Some are incremental and some are fairly radical.  But at the boundaries with unmanaged code, we are forced to participate in a very specific manner that is dictated by SEH.

Regardless, the long term trend is for exception handling to become slower -- in relative terms -- than it is now.  In other words, computers will get faster at doing local operations and relative to this they will become slower at doing non-local operations.  Exception handling will always involve non-local processing.</description></item><item><title>RE: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#51553</link><pubDate>Wed, 26 Nov 2003 14:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:51553</guid><dc:creator>David Levine</dc:creator><description>Thanks Chris, and you are correct that I was referring to managed stack fragments. 

If you ever get the desire to revisit this subject in a future blog I think an interesting topic would be on how the new 64 bit architectures will affect exception processing within the CLR. For example, you mentioned how it performs perfect stack unwinding without getting into the mechanisms. Would this be compatible with existing mechanims or would interop become more proplematic then it is now? And, getting back to the original question, how would this impact performance? 

Dave
PS: Keep the long blogs. 
</description></item><item><title>re: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#57813</link><pubDate>Mon, 12 Jan 2004 17:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:57813</guid><dc:creator>Wallym</dc:creator><description>You are the exception man in my book.&lt;br&gt;&lt;br&gt;Wally</description></item><item><title>What do you think of .NET's exception model?</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#64097</link><pubDate>Thu, 29 Jan 2004 01:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:64097</guid><dc:creator>Watcher of the skies</dc:creator><description /></item><item><title>VB.NET Propagating Improper SEH</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#64141</link><pubDate>Thu, 29 Jan 2004 03:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:64141</guid><dc:creator>Kirk Allen Evans' XML Blog</dc:creator><description /></item><item><title>re: Why are RECTs endpoint-exclusive?</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#76479</link><pubDate>Thu, 19 Feb 2004 22:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:76479</guid><dc:creator>The Old New Thing</dc:creator><description /></item><item><title>Exceptions and Assertions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#94914</link><pubDate>Wed, 24 Mar 2004 02:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:94914</guid><dc:creator>Mark Treadwell</dc:creator><description /></item><item><title>Exceptions and Assertions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#94971</link><pubDate>Wed, 24 Mar 2004 04:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:94971</guid><dc:creator>Mark Treadwell</dc:creator><description /></item><item><title>Custom Base Exception Class</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#97228</link><pubDate>Sat, 27 Mar 2004 06:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:97228</guid><dc:creator>Mark Treadwell</dc:creator><description /></item><item><title>Custom Base Exception Class</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#106062</link><pubDate>Fri, 02 Apr 2004 04:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:106062</guid><dc:creator>Mark Treadwell</dc:creator><description /></item><item><title>Exceptions and Assertions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#186085</link><pubDate>Sat, 17 Jul 2004 16:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:186085</guid><dc:creator>Ohad's WebLog</dc:creator><description /></item><item><title>re: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#186840</link><pubDate>Sun, 18 Jul 2004 19:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:186840</guid><dc:creator>Nicu Georgian Fruja</dc:creator><description>Dear Chris, you did an excelent blog about the CLR Exception model! I found in your material so many useful details. &lt;br&gt;&lt;br&gt;I would still have two questions concerning the mechanism of the two passes. If I got your explanations right, you claimed that during the first pass, no frames are popped off from the stack. On the other hand, I've read in the ECMA 335 standard for CLR that, there are frames which are popped off also in the first pass: I suppose this happens when the calling position is not embedded within a protected block (try).&lt;br&gt;&lt;br&gt;Also, you stated that, in the first pass, all the handlers are executed on the faulting exception frame but still pointing to the corresponding frame. Does this mean, in particular, that every handler is actually executed on the operand stack of the method it belongs? I suppose it should be so: one reason could be the maxstack of each operand stack. &lt;br&gt;&lt;br&gt;Once again, many thanks for your great article. </description></item><item><title>re: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#187466</link><pubDate>Mon, 19 Jul 2004 17:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:187466</guid><dc:creator>Chris Brumme</dc:creator><description>I just glanced through the ECMA spec.  I see where it states that the exception object is popped off the stack when various exception handlers complete execution.  And it's certainly the case that the frames for the filters themselves will be popped off the stack during first pass evaluation, as each filter completes execution.  But no other frames should be popped during the first pass.&lt;br&gt;&lt;br&gt;You are correct that first pass handlers are pushed over the faulting frame, but they have the context of the method that defines the filter.  In unmanaged SEH, this is often achieved by having ESP point to the top of the stack (where it belongs), but EBP points back to the stack frame that defined the filter.  This use of EBP can bring all the locals of that containing method back into scope for the filter code to access.</description></item><item><title>Adding a function to the safeseh list</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#191545</link><pubDate>Thu, 22 Jul 2004 22:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:191545</guid><dc:creator>greggm's WebLog</dc:creator><description /></item><item><title>re: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#198321</link><pubDate>Tue, 27 Jul 2004 14:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:198321</guid><dc:creator>Nicu Georgian Fruja</dc:creator><description>Thank you very much for the prompt answer. &lt;br&gt;&lt;br&gt;I found in ECMA (Partition II) the following: “Stack frames are discarded either as this second walk occurs or after the handler completes, depending on information in the exception handler array entry associated with the handling block.” &lt;br&gt;You said something about the frames of the filters, but in ECMA, there is nothing about non-function frames (for the case of the filters) and consequently, I don't see why the above sentence in ECMA will refer to them.&lt;br&gt;&lt;br&gt;When I've read the first time in ECMA, my understanding was the following: in the first pass, are discarded ONLY the stack frames of the methods with filters whose execution is complete, which are not embedded in protected blocks with finally/fault handlers and which do not want to handle the exception. </description></item><item><title>re: The Exception Model</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#198425</link><pubDate>Tue, 27 Jul 2004 17:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:198425</guid><dc:creator>Chris Brumme</dc:creator><description>Nicu, I just re-read section 12.2.4.5 of the ECMA spec.  It's hard to put algorithms into words, but I think that section does a decent job.  To me, it seems clear that the frames are discarded during the second pass.  The filters cannot be discarded as they are executed, because they are buried on the stack underneath finally blocks.&lt;br&gt;&lt;br&gt;I suppose an implementation that uses linked frames in the heap could selectively unlink and discard filter blocks.  But that approach was never part of our design.</description></item><item><title>re: Visas and degrees</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#236918</link><pubDate>Sat, 02 Oct 2004 06:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:236918</guid><dc:creator>Technical Careers @ Microsoft</dc:creator><description /></item><item><title>re: How did MS-DOS report error codes?</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#355059</link><pubDate>Tue, 18 Jan 2005 12:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:355059</guid><dc:creator>The Old New Thing</dc:creator><description /></item><item><title>Re: A Word from the </title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#403721</link><pubDate>Wed, 30 Mar 2005 15:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:403721</guid><dc:creator>Alex Papadimoulis' WebLog</dc:creator><description /></item><item><title>Custom Base Exception Class - V1 (VB)</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#437200</link><pubDate>Sun, 10 Jul 2005 06:21:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:437200</guid><dc:creator>.NET Hobbyist Programmer</dc:creator><description /></item><item><title>Closing Documents Programmatically is not simple</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#442868</link><pubDate>Mon, 25 Jul 2005 07:22:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:442868</guid><dc:creator>Misha Shneerson</dc:creator><description>Both Word and Excel OMs have APIs that allow closing documents programmatically. I suppose there are...</description></item><item><title>Closing Documents Programmatically is not simple</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#470808</link><pubDate>Sun, 18 Sep 2005 09:54:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:470808</guid><dc:creator>Misha Shneerson</dc:creator><description>Both Word and Excel OMs have APIs that allow closing documents programmatically. I suppose there are...</description></item><item><title>Exceptions can take you into unnecessary code paths</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#525828</link><pubDate>Mon, 06 Feb 2006 20:48:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:525828</guid><dc:creator>Jeff Stong</dc:creator><description>Tim, a fellow Compuware blogger, forwarded me a link to this Microsoft blog entry: Are you aware that...</description></item><item><title>Are you aware that you have thrown over 40,000 exceptions in the last 3 hours?</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#537798</link><pubDate>Thu, 23 Feb 2006 16:09:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:537798</guid><dc:creator>If broken it is, fix it you should</dc:creator><description>This may seem like a preposterous statement, but unfortunately it’s all too common. &lt;br&gt;In my work I go...</description></item><item><title>Win32 Exception 에 관하여</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#546713</link><pubDate>Thu, 09 Mar 2006 04:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:546713</guid><dc:creator>HeeJae's Blog</dc:creator><description>&lt;br&gt;&lt;a rel="nofollow" target="_new" href="http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx"&gt;http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx&lt;/a&gt;&lt;br&gt;저도 아직 안 읽어 봤는데, 같이 일하는 팀 멤버가 읽어 보라고 해서...</description></item><item><title>Everything you never wanted to know about exceptions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#568881</link><pubDate>Wed, 05 Apr 2006 15:17:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:568881</guid><dc:creator>Code obsessed</dc:creator><description /></item><item><title>Under the hood: Win32 SEH </title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#577098</link><pubDate>Sun, 16 Apr 2006 08:20:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:577098</guid><dc:creator>neoragex2002</dc:creator><description>TrackBack From:&lt;a rel="nofollow" target="_new" href="http://neoragex2002.cnblogs.com/archive/0001/01/01/376402.html"&gt;http://neoragex2002.cnblogs.com/archive/0001/01/01/376402.html&lt;/a&gt;</description></item><item><title>Structured Error Handling... My oppinion on the subject.</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#950626</link><pubDate>Sat, 04 Nov 2006 06:48:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:950626</guid><dc:creator>AddressOf.com</dc:creator><description>&lt;p&gt;I've seen a couple of posts concerning the evils that VB.NET has concerning the following: Try Catch&lt;/p&gt;
</description></item><item><title>Exception Handling</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#1516505</link><pubDate>Tue, 23 Jan 2007 23:13:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1516505</guid><dc:creator>Mithun Shanbhag's Weblog</dc:creator><description>&lt;p&gt;In-depth Articles- Matt Peitrek on the internals of SEH . Matt Pietrek on Vectored Exception Handling&lt;/p&gt;
</description></item><item><title>FxCop backlog themes: Exceptions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#2430599</link><pubDate>Sat, 05 May 2007 19:49:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2430599</guid><dc:creator>I may have joined the wrong side</dc:creator><description>&lt;p&gt;Since I started monitoring traffic on this blog a little more closely about a week ago, I had the unexpected&lt;/p&gt;
</description></item><item><title>Unknown exception - code e0434f4e (et e0434f4d)</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#3999850</link><pubDate>Sun, 22 Jul 2007 19:14:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3999850</guid><dc:creator>CoqBlog</dc:creator><description>&lt;p&gt;Si vous utilisez un debugger comme windbg sur des applications manag&amp;#233;es, vous aurez peut &amp;#234;tre d&amp;#233;j&amp;#224; vu&lt;/p&gt;
</description></item><item><title>Are you aware that you have thrown over 40,000 exceptions in the last 3 hours?</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#4479488</link><pubDate>Mon, 20 Aug 2007 15:25:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4479488</guid><dc:creator>If broken it is, fix it you should</dc:creator><description>&lt;p&gt;This may seem like a preposterous statement, but unfortunately it’s all too common. In my work I go through&lt;/p&gt;
</description></item><item><title>Contact lenses articles &amp;raquo; Row of bombs the exception of</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#6843428</link><pubDate>Sun, 23 Dec 2007 11:54:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6843428</guid><dc:creator>Contact lenses articles » Row of bombs the exception of</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.contactlensland.com/2007/12/23/row-of-bombs-the-exception-of/"&gt;http://www.contactlensland.com/2007/12/23/row-of-bombs-the-exception-of/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>Exceptions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#7150109</link><pubDate>Fri, 18 Jan 2008 18:50:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7150109</guid><dc:creator>Speaking of which...</dc:creator><description>&lt;p&gt;Introduction This was originally intended to be a post on identifying and troubleshooting Exceptions&lt;/p&gt;
</description></item><item><title>Exceptions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#7150717</link><pubDate>Fri, 18 Jan 2008 19:58:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7150717</guid><dc:creator>Noticias externas</dc:creator><description>&lt;p&gt;Introduction This was originally intended to be a post on identifying and troubleshooting Exceptions&lt;/p&gt;
</description></item><item><title>Still Learning  &amp;raquo; Blog Archive   &amp;raquo; Details on std::exception handling</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#8491804</link><pubDate>Mon, 12 May 2008 08:18:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8491804</guid><dc:creator>Still Learning  &amp;raquo; Blog Archive   &amp;raquo; Details on std::exception handling</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://imehta.com/blog-ketan/?p=21"&gt;http://imehta.com/blog-ketan/?p=21&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>Getting good dumps when an exception is thrown</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9249498</link><pubDate>Tue, 23 Dec 2008 10:45:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9249498</guid><dc:creator>Rick Byers</dc:creator><description>&lt;p&gt;Often, when an unexpected exception occurs in production code, applications want to generate (and potentially&lt;/p&gt;
</description></item><item><title>try/catch in C# | keyongtech</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9363096</link><pubDate>Thu, 22 Jan 2009 08:17:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9363096</guid><dc:creator>try/catch in C# | keyongtech</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.keyongtech.com/667901-try-catch-in-c"&gt;http://www.keyongtech.com/667901-try-catch-in-c&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>Three Reasons Not to use Exceptions for Model Validation</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9416134</link><pubDate>Fri, 13 Feb 2009 01:57:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9416134</guid><dc:creator>HACKINGON.NET</dc:creator><description>&lt;p&gt;Three Reasons Not to use Exceptions for Model Validation&lt;/p&gt;
</description></item><item><title>ThreadAbortException</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9574035</link><pubDate>Tue, 28 Apr 2009 21:54:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9574035</guid><dc:creator>CLR Team Blog</dc:creator><description>&lt;p&gt;System.Threading.ThreadAbortException is just plain weird. For instance, most exceptions happen because&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9574200</link><pubDate>Tue, 28 Apr 2009 23:20:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9574200</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-10/"&gt;http://www.codedstyle.com/threadabortexception-10/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592682</link><pubDate>Thu, 07 May 2009 06:36:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592682</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception/"&gt;http://www.codedstyle.com/threadabortexception/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592683</link><pubDate>Thu, 07 May 2009 06:37:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592683</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-2/"&gt;http://www.codedstyle.com/threadabortexception-2/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592685</link><pubDate>Thu, 07 May 2009 06:37:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592685</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-3/"&gt;http://www.codedstyle.com/threadabortexception-3/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592688</link><pubDate>Thu, 07 May 2009 06:38:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592688</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-4/"&gt;http://www.codedstyle.com/threadabortexception-4/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592691</link><pubDate>Thu, 07 May 2009 06:38:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592691</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-5/"&gt;http://www.codedstyle.com/threadabortexception-5/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592692</link><pubDate>Thu, 07 May 2009 06:38:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592692</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-6/"&gt;http://www.codedstyle.com/threadabortexception-6/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592693</link><pubDate>Thu, 07 May 2009 06:39:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592693</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-7/"&gt;http://www.codedstyle.com/threadabortexception-7/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592694</link><pubDate>Thu, 07 May 2009 06:39:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592694</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-8/"&gt;http://www.codedstyle.com/threadabortexception-8/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592699</link><pubDate>Thu, 07 May 2009 06:40:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592699</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-11/"&gt;http://www.codedstyle.com/threadabortexception-11/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592702</link><pubDate>Thu, 07 May 2009 06:40:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592702</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-12/"&gt;http://www.codedstyle.com/threadabortexception-12/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592705</link><pubDate>Thu, 07 May 2009 06:41:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592705</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-14/"&gt;http://www.codedstyle.com/threadabortexception-14/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592707</link><pubDate>Thu, 07 May 2009 06:42:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592707</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-17/"&gt;http://www.codedstyle.com/threadabortexception-17/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592710</link><pubDate>Thu, 07 May 2009 06:43:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592710</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-18/"&gt;http://www.codedstyle.com/threadabortexception-18/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592711</link><pubDate>Thu, 07 May 2009 06:43:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592711</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-19/"&gt;http://www.codedstyle.com/threadabortexception-19/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592715</link><pubDate>Thu, 07 May 2009 06:44:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592715</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-20/"&gt;http://www.codedstyle.com/threadabortexception-20/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592719</link><pubDate>Thu, 07 May 2009 06:45:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592719</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-22/"&gt;http://www.codedstyle.com/threadabortexception-22/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592723</link><pubDate>Thu, 07 May 2009 06:46:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592723</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-24/"&gt;http://www.codedstyle.com/threadabortexception-24/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>ThreadAbortException | Coded Style</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9592726</link><pubDate>Thu, 07 May 2009 06:47:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592726</guid><dc:creator>ThreadAbortException | Coded Style</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.codedstyle.com/threadabortexception-25/"&gt;http://www.codedstyle.com/threadabortexception-25/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title> cbrumme s WebLog The Exception Model | Paid Surveys</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9653948</link><pubDate>Fri, 29 May 2009 19:20:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9653948</guid><dc:creator> cbrumme s WebLog The Exception Model | Paid Surveys</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://paidsurveyshub.info/story.php?title=cbrumme-s-weblog-the-exception-model"&gt;http://paidsurveyshub.info/story.php?title=cbrumme-s-weblog-the-exception-model&lt;/a&gt;&lt;/p&gt;
</description></item><item><title> cbrumme s WebLog The Exception Model |  Portable Greenhouse</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9676200</link><pubDate>Mon, 01 Jun 2009 13:17:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9676200</guid><dc:creator> cbrumme s WebLog The Exception Model |  Portable Greenhouse</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://portablegreenhousesite.info/story.php?id=731"&gt;http://portablegreenhousesite.info/story.php?id=731&lt;/a&gt;&lt;/p&gt;
</description></item><item><title> cbrumme s WebLog The Exception Model |  Portable Greenhouse</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9677025</link><pubDate>Mon, 01 Jun 2009 14:35:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9677025</guid><dc:creator> cbrumme s WebLog The Exception Model |  Portable Greenhouse</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://portablegreenhousesite.info/story.php?id=10354"&gt;http://portablegreenhousesite.info/story.php?id=10354&lt;/a&gt;&lt;/p&gt;
</description></item><item><title> cbrumme s WebLog The Exception Model | Menopause Relief</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9711258</link><pubDate>Tue, 09 Jun 2009 03:15:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9711258</guid><dc:creator> cbrumme s WebLog The Exception Model | Menopause Relief</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://menopausereliefsite.info/story.php?id=1281"&gt;http://menopausereliefsite.info/story.php?id=1281&lt;/a&gt;&lt;/p&gt;
</description></item><item><title> cbrumme s WebLog The Exception Model | Cellulite Creams</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9712044</link><pubDate>Tue, 09 Jun 2009 05:55:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9712044</guid><dc:creator> cbrumme s WebLog The Exception Model | Cellulite Creams</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://cellulitecreamsite.info/story.php?id=10585"&gt;http://cellulitecreamsite.info/story.php?id=10585&lt;/a&gt;&lt;/p&gt;
</description></item><item><title> cbrumme s WebLog The Exception Model | debt solutions</title><link>http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx#9790848</link><pubDate>Fri, 19 Jun 2009 20:18:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9790848</guid><dc:creator> cbrumme s WebLog The Exception Model | debt solutions</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://debtsolutionsnow.info/story.php?id=2139"&gt;http://debtsolutionsnow.info/story.php?id=2139&lt;/a&gt;&lt;/p&gt;
</description></item></channel></rss>