当前位置: 首页 > 知识库问答 >
问题:

try捕获语句的位置

暨宸
2023-03-14

我有一些代码现在看起来有点像这样:

public void MainFunction() 
{
   try
   {
      SomeProblemFunction();
   }
   catch
   {
      AllFineFunction();
   }
}

private void SomeProblemFunction() { ... }
private void AllFineFunction() { ... }

如您所见,我目前正在将对SomeProblemFunction的调用包装在try语句中,因为该函数可能会失败(它依赖于外部web服务调用)。

我的问题是:try语句应该是a)在问题函数之外(就像我现在看到的那样)还是b)在问题函数内部?

谢谢。

共有3个答案

曹驰
2023-03-14

根据经验,我尝试构建代码,将try捕获集中到问题可能发生的确切位置。

也就是说,你的两个解决方案都是正确的。

如果是我的代码我会这么做

public void MainFunction() 
{
   try
   {
      SomeProblemFunction();
   }
   catch(Exception e)
   {
      Messagebox.Show(e.Message);
   }
}

private void SomeProblemFunction() {
    try{
        web call
    }
    catch{
         throw a specific exception related to this spot
    }
}
private void AllFineFunction() { ... }

使用此方法,您可以轻松创建处理大量非常准确的异常的应用程序

陈刚洁
2023-03-14

你所拥有的是正确的;请参见MSDN示例:

public class ThrowTestB
{
    static void Main()
    {
        try
        {
            // TryCast produces an unhandled exception.
            TryCast();
        }
        catch (Exception ex)
        {
            // Catch the exception that is unhandled in TryCast.
            Console.WriteLine
                ("Catching the {0} exception triggers the finally block.",
                ex.GetType());

            // Restore the original unhandled exception. You might not 
            // know what exception to expect, or how to handle it, so pass  
            // it on. 
            throw;
        }
    }

    public static void TryCast()
    {
        int i = 123;
        string s = "Some string";
        object obj = s;

        try
        {
            // Invalid conversion; obj contains a string, not a numeric type.
            i = (int)obj;

            // The following statement is not run.
            Console.WriteLine("WriteLine at the end of the try block.");
        }
        finally
        {
            // Report that the finally block is run, and show that the value of 
            // i has not been changed.
            Console.WriteLine("\nIn the finally block in TryCast, i = {0}.\n", i);
        }
    }
    // Output: 
    // In the finally block in TryCast, i = 123. 

    // Catching the System.InvalidCastException exception triggers the finally block. 

    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
}
袁泰平
2023-03-14

通常,您希望允许异常传播到应用程序边界。除了你自己,你只想做几件事中的一件:

  • 把它包起来
  • 更换它
  • 让它传播吧

更新

从您的问题来看,您似乎在为web服务调用寻找容错解决方案。这是一个更复杂的问题,而不仅仅是“我该把我的试捕器放在哪里?”您仍然可以将异常处理放在应用程序边界上,但在那里您可以实现容错策略。这需要考虑很多因素,包括异步调用web服务、重试次数等。我建议搜索web服务容错性。

 类似资料:
  • 本文向大家介绍Python用Try语句捕获异常的实例方法,包括了Python用Try语句捕获异常的实例方法的使用技巧和注意事项,需要的朋友参考一下 python的异常,以及用try复合语句处理异常。 运行代码时有时会出现各种各样的错误,致使解析器中断执行,并提示xxxxxxErorr的提示,后面跟具体的错误的描述,这被称为是引发了异常。 其实异常告诉我们的是遇到了什么类型的错误。xxxxErorr

  • 有什么办法可以做到这一点吗? 我想我可以使用scanner来代替它,但是我只是好奇是否有办法在捕获异常后重复try语句。

  • 我正在做一个3D阵列项目,我需要测试一个细胞周围的每个细胞。但是,如果单元位于数组的边缘,则在数组之外测试单元将抛出越界异常。我想用catch语句来解决这个问题,但是编写一个try-and-catch来测试每个块需要非常大量的代码(3D数组中一个单元周围有8个单元)。有没有一种方法可以用一次捕捉多次“尝试”,然后继续它停止的地方?例如,如果tester方法测试一个越界单元格,我需要它不仅捕获,而且

  • 在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。 所以为了确保一定能回收 try 块中打开的物理资源,异

  • 我刚刚开始用java编写一个21点游戏。我试图让程序要求用户再次输入,如果他们输入的现金不是一个有效的整数。我看到许多带有catch的try语句示例,但没有一个是有效的。程序给出的错误InputMismatchException无法解析为类型。我遵循的一个线程就是这个,我有完全相同的代码,只是变量名不同。给你。Java输入不匹配异常 这是我的密码: 任何关于为什么我几乎精确的代码不起作用的帮助都将

  • 问题内容: 有没有更好的方法来执行以下操作: 看起来很讨厌,我不想这样做: 保持最高效率。 问题答案: 也许您可以尝试这样的事情: 您可以这样称呼它: 这将尝试按它们在列表中的顺序调用这些方法。如果您想传递任何参数,可以像下面这样在列表之后传递它们: