I\'m looking at the article C# - Data Transfer Object on serializable DTOs.
The article includes this piece of code:
public static string Se
A point that people haven't mentioned is that while .NET languages don't really make a proper distinction, the question of whether one should take action when an exception occurs, and whether one will resolve it, are actually distinct questions. There are many cases where one should take action based upon exceptions one has no hope of resolving, and there are some cases where all that is necessary to "resolve" an exception is to unwind the stack to a certain point--no further action required.
Because of the common wisdom that one should only "catch" things one can "handle", a lot of code which should take action when exceptions occur, doesn't. For example, a lot of code will acquire a lock, put the guarded object "temporarily" into a state which violates its invariants, then put it object into a legitimate state, and then release the lock back before anyone else can see the object. If an exception occurs while the object is in a dangerously-invalid state, common practice is to release the lock with the object still in that state. A much better pattern would be to have an exception that occurs while the object is in a "dangerous" condition expressly invalidate the lock so any future attempt to acquire it will immediately fail. Consistent use of such a pattern would greatly improve the safety of so-called "Pokemon" exception handling, which IMHO gets a bad reputation primarily because of code which allows exceptions to percolate up without taking appropriate action first.
In most .NET languages, the only way for code to take action based upon an exception is to catch
it (even though it knows it's not going to resolve the exception), perform the action in question and then re-throw
). Another possible approach if code doesn't care about what exception is thrown is to use an ok
flag with a try/finally
block; set the ok
flag to false
before the block, and to true
before the block exits, and before any return
that's within the block. Then, within finally
, assume that if ok
isn't set, an exception must have occurred. Such an approach is semantically better than a catch
/throw
, but is ugly and is less maintainable than it should be.