Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-try-and-catch语句使用_C#_Visual Studio_Try Catch_Robust - Fatal编程技术网

C#-try-and-catch语句使用

C#-try-and-catch语句使用,c#,visual-studio,try-catch,robust,C#,Visual Studio,Try Catch,Robust,用try-and-catch包装每个函数是否是一种好的做法 我正在用c#构建一个服务器,我试图了解使它更健壮和防止崩溃的方法之一是否是用try&catch语句包装其中的每个函数 这样做合理吗?我认为最好将一组函数封装在try中,捕获不同的异常并处理它们。它提供了具有相同功能的可读性更强、更小的代码 用try-and-catch包装每个函数是否是一种好的做法 绝对不是。这是一个灾难的秘诀——这意味着你可能会试图继续执行一个请求,即使出现了一些问题,国家已经腐败 通常,您应该只有catch块,在这些

用try-and-catch包装每个函数是否是一种好的做法

我正在用c#构建一个服务器,我试图了解使它更健壮和防止崩溃的方法之一是否是用try&catch语句包装其中的每个函数


这样做合理吗?

我认为最好将一组函数封装在try中,捕获不同的异常并处理它们。它提供了具有相同功能的可读性更强、更小的代码

用try-and-catch包装每个函数是否是一种好的做法


绝对不是。这是一个灾难的秘诀——这意味着你可能会试图继续执行一个请求,即使出现了一些问题,国家已经腐败

通常,您应该只有catch块,在这些块中您可以实际处理异常并成功继续;否则,您应该让异常冒泡。因此,您可能需要一个
catch
块来重试某些操作,但只重试特定的操作

然后,您可能在顶层有一个
catch
块,以阻止服务器本身崩溃。您还没有告诉我们您正在构建什么类型的服务器——框架本身可能会提供这样一个适当的
catch


捕获异常的另一个原因是将其包装,并将其作为更合适的异常重新显示,以隐藏实现细节,并可能添加更多上下文。坦率地说,这可能有点痛苦,而且只在某些情况下有用。这实际上取决于引发异常的代码,以及您希望如何处理它。

两个具体而重要的注意事项:

  • 模拟-始终使用try/catch/finally块:如果使用模拟,则必须始终将代码包装在try/catch/finally块中,并将注销代码放入finally块中。原因是,如果在模拟时引发异常,并且异常“冒泡”,您仍将以模拟身份登录,这是一种安全风险

  • 循环-永远不要使用try/catch块:try/catch块很昂贵。如果您的应用程序遇到了一个障碍,异常应该会冒泡到顶部,这很好,但千万不要在循环中使用try/catch来迭代到下一个项目。例如,一个循环执行某些计算,如果数据不正确,则会出现除以0的错误。与其执行计算,然后捕获异常并继续循环,不如检查0并继续循环,这样就不会引发异常


  • 我想您应该补充一点,捕捉异常抛出您自己的异常是合适的,将原始异常包装起来,以便添加更多相关但不可用的信息,“这是一个灾难的配方,它意味着…已损坏”-目前,如果我在其中一个函数(响应某个客户端请求的函数)中遇到异常,我会向客户端响应一个错误。这是我从零开始构建的基本应用服务器。。。我目前在每个函数中使用try-catch的原因是想知道在哪个特定函数中出现异常。。。我如何使用一个中央尝试捕获来实现这一点?@Eyal:“如何使用一个中央尝试捕获来实现这一点?”->使用拦截框架。联合拦截就是一个例子。我相信温莎城堡也有类似的东西。@Eyal:只需记录堆栈跟踪。这将显示异常的起源。