I think that the aim is not to prepare the exceptions mechanism for cases where it may not be completely necessary. But your observation is good, maybe a proper code snippet could be:
if(conn.State != ConnectionState.Closed)
try
conn.Close();
catch
Looking at the first example:
if(conn.State != ConnectionState.Closed)
conn.Close();
Doesn't this suffer from a race condition? What if the connection is closed inbetween these two lines?
It seems like catching the exception anyway is necessary for a robust solution.