This is WRONG. The work done in the finally block need only be done if the stream is opened. Until the assignment of 's' completes, the finally block is not to be executed. The 'if' statement is basically checking that fact. The correct usage is:

Stream s = new FileStream(...);
try {
...
}
finally {
s.Close();
}

No excuses! Programmers are lucky that the 'if' check can even be done - the anti-pattern doesn't work in general. Consider this scenario involving thread synchronization:

Monitor.Enter();
try {
...
}
finally {
Monitor.Exit();
}

To write the above using the anti-pattern, one would need to be able to check that the monitor was entered, which may or may not be possible. Without a check, the anti-pattern might exit a monitor that was not entered.

With respect to exception handling, to catch an exception for Enter through to Exit the correct pattern is:

Your pattern 'to catch an exception for Enter through to Exit' serves to move the exception handling code even further from the source of the exception. Code present in the outer catch which serves to handle exceptions from the Monitor.Enter() (or even new FileStream(...)) would not intuitively be linked to the code that caused the exception, since it's so far away.