C# 为什么试块需要接球

C# 为什么试块需要接球,c#,syntax,try-catch,catch-block,C#,Syntax,Try Catch,Catch Block,我有一些这样的代码 try { result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value; } catch { } 现在,在调用此调用之前,我不知道我要查找的属性是否存在(良好的ol sharepoint) 因此,我编写我希望创建的代码的唯一线性方法就是这样 try { result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value; }

我有一些这样的代码

try
{
    result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value;
} catch { }
现在,在调用此调用之前,我不知道我要查找的属性是否存在(良好的ol sharepoint)

因此,我编写我希望创建的代码的唯一线性方法就是这样

try
{
    result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value;
} catch { }
try
{
    result.LastName = nodes[myIdx].Attributes["ows_LastName"].Value;
} catch { }

....
现在,我不再使用这段代码的catch部分,而是使用了大量完全冗余的行

为什么我不能这么做

try { result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value; }
那么,为什么我们要显式地强制声明catch块,即使它没有被处理?我相信有一个很好的理由,但我无法解决它


编辑:在所有人都开始对我说吞下一个例外是不好的之前,诸如此类。我们(和我)都知道这些论点,但在这个(和许多)现实世界的场景中,异常没有任何异常,我也无法(或需要)做任何事情来修复行为。

如果你想吞下异常(
捕获它,但什么也不做),你必须明确地这样做

这通常是糟糕的做法,因此没有理由提供语法捷径。一般来说,你应该:

  • 以某种方式处理异常。这可能意味着:
  • A.重试 B使用更有意义的消息重新播放它(保留内部异常)。 C换一种方式。 D记录它(尽管记录和重新刷新可能更好)。 E其他
    2.让它冒泡(不尝试,或者只是尝试/最终)。

    try/catch块是专门为捕获和处理应用程序中抛出的异常而设计的


    简单地接受异常通常是一个坏主意(即使您只是记录异常),并且必须显式执行。

    原因可能是如果您无法处理异常,就不应该捕获异常。允许您在没有相应的
    catch
    的情况下
    try
    只能启用最坏的做法


    对于您正在引用的特定代码,您是否可以在尝试访问索引器之前进行空检查?

    这是语言语法的一部分。如果没有至少一个
    捕获
    ,或者最后一个
    捕获
    ,则不能
    尝试
    。没有独立的
    try
    ,只有和


    如果您不想麻烦处理异常(
    catch
    ),或者至少确保不管发生了什么,后续的一些代码始终运行(即
    最终
    ),那么尝试一些代码就没有意义了。

    为什么不检查该项是否为
    null

    if(nodes[myIdx].Attributes != null &&
       nodes[myIdx].Attributes["ows_FirstName"] != null) {
        /* ... your code ... */
    }
    
    或:


    这个问题基本上已经得到了回答:


    基本上,如果你抓住了它,那么你应该用它做点什么,否则就不要抓住它。在您的情况下,为什么不能先检查属性值是否存在?

    必须有另一种方法来检查属性是否存在,您不应该出于某些功能目的使用异常处理,您的代码如下:

    try
    {
        newstring = oldString.ToString();
    }
    catch{}
    
    你应该做的是:

    if(oldString != null)
    {
        newstring = oldString;
    }
    

    请记住,try-catch用于处理名为“exception”的事物。

    您不应该有空的catch块。这是糟糕的编程实践


    让我想起了经典的ASP
    On Error Resume Next

    它们不是多余的-它们有特定的用途。默认情况下,缺少
    catch
    块将向调用方法重新抛出异常。一个空的
    catch
    块实质上是“吞咽”异常并让程序继续,而不管是否抛出异常;通常这是一种坏习惯

    这个例外根本没有什么例外

    在这种情况下,一种类型的异常可能不是“异常”,但这并不是唯一可能发生的异常。您应该处理该异常,并适当处理任何其他异常

    例如—

    如果
    节点
    为空怎么办?如果
    myIdx
    不在
    节点
    数组的范围内,该怎么办?这两种情况中的任何一种都是例外情况,您应该专门处理它们,或者让调用程序处理它们并采取适当的行动

    [没有]我能做(或需要做)什么来纠正这种行为


    您可能无法修复它,但您可能需要了解它。在这种情况下,程序的行为如何不同?记录消息?提出警告?设置默认值?什么都不做可能是一个合适的答案,但很可能不是对任何可能的异常的适当响应。

    看起来您正在使用一个SharePoint Web服务,所以返回类型是某种XmlElement?我很确定有一种方法可以检查属性是否存在,这比抛出异常要便宜


    此外,您还需要一个封装检查和数据检索的助手方法。

    阅读此[post][1][1]:@CheGueVerra-不确定这与我的问题有什么关系?他大概是在问为什么会出现这种语法。因为sharepoint XML Web服务有一种奇妙的行为,即简单地忽略空属性,而不是提供空值。不幸的是,属性集合通常会包含至少一个值,因为您必须记住,通常会返回至少几个列。如果只返回一列,这可能会起作用。希望这是有意义的。这将起作用,因为您可以随时检查多个列。。。我不太明白你的困惑在哪里…在回去检查你是否正确后,我的错。你的解决方案确实有效。很抱歉,Sharepoint XML Web服务只是省略了null属性,而不是提供空值。这意味着对于每个数据子集(即:每一行),我都需要遍历数据并进行检查。在我看来,简单地允许异常发生(尽管有争议)更为实际
    try
    {
        newstring = oldString.ToString();
    }
    catch{}
    
    if(oldString != null)
    {
        newstring = oldString;
    }