近来在完全编译产品的代码时,常常会发现较多的warning散布在各个project中。虽然绝大多数的warning并不对程序产生太多的影响,但是作为一个好的产品,0 warning也应该是developer起码的追求。于是我挨个察看这些warning,发现基本都是变量定义后未使用和少量的unreachable code。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    从数量上看,unreachable code WARNING总的来说并不多,整个产品也就发现了2~3个,主要是在switch语句的case中使用return代替break后,造成了最后的return形同虚设。其他的warning基本上都来至:已定义的xxx变量从未被使用,并且这类warning又分为了:普通的变量定义和try/catch中的变量定义。对于普通的变量定义后未使用,我们把他们的定义删除就行了,那么try/catch怎么办呢?íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    try/catch中定义的未使用变量,就是平时我们常见的各种异常类型的e、ex、exp、ext等变量。出现这些warning的一般代码场景为: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
  tryíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
{íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
   
// some codeíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
catch(SpecialException e)íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
{íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
   
// handle exceptioníÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    问题就是在handle exception这个代码段中,我们很多时候是不需要使用变量e的,除非我们要显示纪录异常的错误描述信息。这时您可能会说,那么为什么要把try/catch定义为上面的形式呢?这样定义不就解决问题了吗? íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
  try
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
{íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
   
// some codeíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
catchíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
{íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
   
// handle exceptioníÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
// not any warning due to case aboveíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    似乎看起来这个修改是正确的,但是这个修改却是十分消极的,因为没有Exception类型的catch,通常都只能放置对错误消极补救的代码,也就是说异常到达这里时,最多是给用户显示一个操作已失败的提示,而不能真正的处理任何问题。同时对于catch语句,Anders在讲Checked Exceptions在C#中的取舍时也说到过,程序员其实大量写下的代码都是catch curly curly而已(就是catch {})。所以我们不该让异常远离了它的context后再去处理,我们需要在可把握的状态最及时地处理异常(除非确实要忽略它),也就是说我们同时必须要俘获确定的异常类型。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    在msdn的C#教程中,我们可以看见对于try/catch语句,微软给出的定义示例为: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
try
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
try-block íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
catch (exception-declaration-1) catch-block-1 íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
catch (exception-declaration-2) catch-block-2 íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
...íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
tryíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
try-block catchíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
catch-block
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    不幸的是这个教程中的定义是简陋的,而在《C# Language Specification》的"The try statement" Chapter中,try/catch语句定义的EBNF片断为: try-statement: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    try block catch-clausesíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    try block finally-clauseíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    try block catch-clauses finally-clause íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
catch-clauses: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    specific-catch-clauses general-catch-clause[opt]íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    specific-catch-clauses[opt] general-catch-clause íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
specific-catch-clauses: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    specific-catch-clauseíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    specific-catch-clauses specific-catch-clause íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
specific-catch-clause: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    catch ( class-type identifier[opt] ) block íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
general-catch-clause: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    catch block íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
finally-clause: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    finally block
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    注意红色的identifier[opt],也就是说:class-type后的identifier是optional的,这样一来我们就可以把最初的try/catch语句根据我们需求优化为: íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
  tryíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
{íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
   
// some codeíÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
catch(SpecialException)íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
{íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
   
// handle exceptioníÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    由此以来,unused variable warning和获取指定类型异常的矛盾就解决了。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ