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块。这是糟糕的编程实践
让我想起了经典的ASPOn 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;
}