【问题标题】:C# value is declared but never usedC# 值已声明但从未使用
【发布时间】:2009-12-11 11:45:11
【问题描述】:

我尝试捕获不同类型的错误:

catch (XmlException XmlExp)
{
    return false; 
}

catch (XmlSchemaException XmlSchExp)
{
    return false; 
}
catch (Exception GenExp)
{
    throw GenExp;
}

请注意,XMLException XMLExp 已声明但从未使用过。是否可以在不声明局部变量的情况下捕获 XMLException?

这是有效的代码吗:

catch (XmlException)
{
    return false; 
}

【问题讨论】:

  • 您是否曾尝试删除 XmlSchExp 文本(仅此而已)?尝试。 :)
  • 说真的,试试吧!它比发布问题花费的时间更少。另外,只需使用throw; 而不是throw GenExp; 是您的意图是重新抛出异常
  • 在 catch 块中抛出异常也是一个坏主意:throw GenExp;。您将丢失堆栈跟踪。只需写“投掷”;重新抛出捕获的异常。

标签: c#


【解决方案1】:

是的,像这样

catch (XmlException)
{
    return false; 
}

catch (XmlSchemaException)
{
    return false; 
}

catch (Exception GenExp)
{
     // inspect or use GenExp
     throw;
}

【讨论】:

  • 使用 catch(Exception) { throw } 代替。这使 stracktrace 信息保持正确。重新抛出异常会破坏原始堆栈跟踪
  • @Sander - 或者如果只是重新抛出,则完全省略该 catch 块
  • @Phil Nash - 如果所有 catch 块所做的都是重新抛出,那就更好了
【解决方案2】:

这样做

catch (XmlException)
{
   return false; 
}

catch (XmlSchemaException)
{
   return false; 
}

catch (Exception)
{
   throw;
}

【讨论】:

    【解决方案3】:

    随便用

    catch (XmlException)
    {
        throw;
    }
    

    当您抛出特定的异常对象(如 throw ex)时,堆栈跟踪将被覆盖。

    【讨论】:

      【解决方案4】:

      是的。只是错过了变量名:

      catch (XmlException)
      {
          return false; 
      }
      

      【讨论】:

        【解决方案5】:

        是的,你可以:

        catch (XmlException)
        {
          return false; 
        }
        

        当然,所有其他有关异常的规则都适用 - 即不使用它们进行流控制,避免任何可能引发它们的情况等。

        【讨论】:

          【解决方案6】:
          catch (XmlException)
          {
              return false; 
          }
          catch (XmlSchemaException)
          {
              return false; 
          }
          catch (Exception GenExp)
          {
              throw GenExp;
          }
          

          只需省略变量名。 对于最后一个问题,我建议使用throw; 而不是throw GenExp - 因为后者会丢失调用堆栈。虽然如果你真的只是重新抛出,那么只需省略整个 catch 块。

          【讨论】:

            【解决方案7】:
            catch (Exception unknownException)
            {
               throw new Exception("Unknown error.", unknownException);
            }
            

            【讨论】:

              【解决方案8】:
              catch 
              {}
              

              也是有效代码并捕获所有异常。

              【讨论】:

                【解决方案9】:

                重要通知!

                这是一种非常糟糕的编程风格——使用类似的结构:

                try
                {
                  // smth
                }
                catch(IOException e)
                {
                   throw e;
                }
                

                这意味着,异常堆栈将从(堆栈的)这一点开始,您可以丢失任何低于该点的堆栈帧。

                正确:

                 try
                    {
                      //smth
                    }
                    catch(IOException e)
                    {
                      throw;
                    }
                

                【讨论】:

                  【解决方案10】:

                  1- 我认为你应该自己做这件事。

                  2- catch (XmlException) //有效 { 返回假; } catch (XmlSchemaException) //有效 { 返回假; } 捕获(异常 GenExp)
                  { 抛出 GenExp; }
                  //有效但没有意义,因为会发生异常并且没有try catch块来处理它

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-09-21
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-03-29
                    • 2015-08-12
                    • 2021-12-14
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多