标签: try-catch

使用try/catch防止应用程序崩溃

我一直在研究一款try/catch经常使用的Android应用程序,以防止它甚至在没有必要的地方崩溃.例如,

xml layout带有的视图id = toolbar引用如下:

// see new example below, this one is just confusing
// it seems like I am asking about empty try/catch
try {
    View view = findViewById(R.id.toolbar);
}
catch(Exception e) {
}
Run Code Online (Sandbox Code Playgroud)

整个应用程序都使用此方法.堆栈跟踪没有打印,很难找到出错的地方.应用程序突然关闭而不打印任何堆栈跟踪.

我让我的大四学生向我解释,他说,

这是为了防止生产中的崩溃.

我完全不同意它.对我而言,这不是阻止应用程序崩溃的方法.它表明开发人员知道他/她在做什么,并且有疑问.

这是行业中使用的方法,以防止企业应用程序崩溃?

如果try/catch是真的,那么我们真的需要可以附加一个带有UI线程或其他线程的异常处理程序并捕获所有内容吗?如果可能的话,那将是更好的方法.

是的,空try/catch是坏的,即使我们将堆栈跟踪或日志异常打印到服务器,try/catch在所有应用程序中随机包装代码块对我来说没有意义,例如当每个函数都包含在a中时try/catch.

UPDATE

由于这个问题引起了很多关注,有些人误解了这个问题(也许是因为我没有明确表达过),我将把它改写一下.

这是开发人员在这里做的事情

  • 一个函数被编写和测试,它可以是一个小函数,它只是初始化视图或复杂的视图,在测试后它被包裹在try/catch块中.即使是永远不会抛出任何异常的函数.

  • 这种做法在整个申请中使用.有时会打印堆栈跟踪,有时只会出现debug log一些随机错误消息.此错误消息因开发人员而异.

  • 使用这种方法,应用程序不会崩溃,但应用程序的行为变得不确定.甚至有时候很难跟上出错的地方.

  • 我一直在问的真正问题是; 为了防止企业应用程序崩溃,业界是否遵循这种做法?而且我不是在询问空的try/catch.是不是,用户喜欢不会比意外行为的应用程序崩溃的应用程序?因为它真的归结为崩溃或用空白屏幕呈现用户或行为用户不知道.

  • 我在这里发布了一些真实代码的片段

      private void …
    Run Code Online (Sandbox Code Playgroud)

java android design-patterns coding-style try-catch

77
推荐指数
5
解决办法
2万
查看次数

如何在PHP中有效地使用try ... catch块

我一直在我的PHP代码中使用try..catch块,但我不确定我是否一直在正确使用它们.

例如,我的一些代码如下所示:

 try {
      $tableAresults = $dbHandler->doSomethingWithTableA();
      $tableBresults = $dbHandler->doSomethingElseWithTableB();
 } catch (Exception $e) {
      return $e;
 }
Run Code Online (Sandbox Code Playgroud)

所以我在同一个try/catch块中对多个数据库操作进行分组,因为如果在任何事务中发生任何异常,我将能够处理它.

我这样做是因为我认为它比以下更具可读性和效率:

 try {
       $tableAresults = $dbHandler->doSomethingWithTableA();
 } catch (Exception $e) {
       return $e;
 }
 try {
       $tableBresults = $dbHandler->doSomethingWithTableB();
 } catch (Exception $e) {
       return $e;
 }
Run Code Online (Sandbox Code Playgroud)

虽然,我不确定我所做的是一种好的做法,还是一种懒惰的方法来捕捉异常.

我的假设是,只有异常需要特殊处理时,它才应该有自己的try/catch块,否则将它们分组到同一个try/catch中应该没问题.

所以我的问题是:

每个数据库事务使用try/catch块有什么好处吗?或者我仍然可以在同一个try/catch块中对多个数据库事务进行分组而没有任何问题?

嵌套try/catch块可以吗?谢谢!

编辑

return语句主要仅用于演示目的,但我也使用了返回,catch()因为我正在向该方法发出AJAX请求,而Javascript期待一个JSON对象,然后如果发生异常,我返回一个空的JSON编码数组.我只是认为在我的示例中放置特定代码不会增加任何值.

php exception-handling try-catch

75
推荐指数
5
解决办法
12万
查看次数

投掷或尝试捕获

在决定是否向方法添加throws子句或使用try-catch?时,一般的经验法则是什么?

从我自己阅读的内容来看,throws应该在调用者违反合同结束时使用(传递对象),并且try-catch在方法内执行操作期间发生异常时应该使用.它是否正确?如果是这样,应该在呼叫者方面做些什么?

PS:通过谷歌和搜索引擎优化搜索,但希望得到一个明确的答案.

java exception-handling exception try-catch throws

71
推荐指数
4
解决办法
5万
查看次数

Node.js捕获spawn后抛出的ENOMEM错误

由于在使用spawn时抛出了ENOMEM(内存不足)错误,我的Node.js脚本崩溃了.

错误:

child_process.js:935
  throw errnoException(process._errno, 'spawn');
        ^

Error: spawn ENOMEM
  at errnoException (child_process.js:988:11)
  at ChildProcess.spawn (child_process.js:935:11)
  at Object.exports.spawn (child_process.js:723:9)
  at module.exports ([...]/node_modules/zbarimg/index.js:19:23)
Run Code Online (Sandbox Code Playgroud)

我已经在errorexit事件中使用了侦听器,但是如果出现此错误,则不会触发它们.

我的代码:

zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... }); 
Run Code Online (Sandbox Code Playgroud)

完整源代码可用.

有什么办法可以防止脚本崩溃吗?如何捕获抛出的ENOMEM错误?

谢谢!

javascript error-handling try-catch spawn node.js

70
推荐指数
3
解决办法
4万
查看次数

在 Java-8 中捕获多个异常

在尝试多捕获功能时,我在我的m1()方法中发现一切都按预期正常工作。

但是,在m2()相同的代码中不能编译。我刚刚更改了语法以减少代码行数。

public class Main {

    public int m1(boolean bool) {
        try {
            if (bool) {
                throw new Excep1();
            }
            throw new Excep2();
            //This m1() is compiling  abs fine.
        } catch (Excep1 | Excep2 e) {
            return 0;
        }
    }

    public int m2(boolean b) {
        try {
            throw b ? new Excep1() : new Excep2();
            //This one is not compiling.
        } catch (Excep1 | Excep2 e) {
            return 0;
        }
    }

    private static interface …
Run Code Online (Sandbox Code Playgroud)

java exception try-catch java-8

70
推荐指数
2
解决办法
5013
查看次数

在PHP Try Catch块中抛出异常

我在Drupal 6 .module文件中有一个PHP函数.我正在尝试在执行更密集的任务(例如数据库查询)之前运行初始变量验证.在C#中,我曾经在我的Try块的开头实现了IF语句,如果验证失败则会抛出新的异常.抛出的异常将在Catch块中捕获.以下是我的PHP代码:

function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    throw $e->getMessage();
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行代码时,它告诉我对象只能在Catch块中抛出.

提前致谢!

php exception-handling try-catch drupal-6

69
推荐指数
4
解决办法
10万
查看次数

C#"最终"阻止总是执行吗?

可能重复:
如果我在Try块中返回一个值,是否会触发Finally语句中的代码?

请考虑以下代码C#代码."finally"块是否执行?

public void DoesThisExecute() {
   string ext = "xlsx";
   string message = string.Empty;
   try {
      switch (ext) {
         case "xls": message = "Great choice!"; break;
         case "csv": message = "Better choice!"; break;
         case "exe": message = "Do not try to break me!"; break;
         default:
            message = "You will not win!";
            return;
      }
   }
   catch (Exception) {
      // Handle an exception.
   }
   finally {
      MessageBox.Show(message);
   }
}
Run Code Online (Sandbox Code Playgroud)

哈,在我写完这篇文章之后,我意识到我本可以在Visual Studio中自己测试过.但是,请随时回答!

c# try-catch

68
推荐指数
5
解决办法
8万
查看次数

68
推荐指数
3
解决办法
2万
查看次数

如何在Linux中捕获分段错误?

我需要在第三方库清理操作中捕获分段错误.这有时会在我的程序退出之前发生,我无法解决这个问题的真正原因.在Windows编程中,我可以使用__try - __catch执行此操作.是否有跨平台或平台特定的方式来做同样的事情?我需要在Linux,gcc中使用它.

c++ try-catch segmentation-fault

67
推荐指数
5
解决办法
10万
查看次数

如何捕获此错误:"注意:未定义的偏移量:0"

我想抓住这个错误:

$a[1] = 'jfksjfks';
try {
      $b = $a[0];
} catch (\Exception $e) {
      echo "jsdlkjflsjfkjl";
}
Run Code Online (Sandbox Code Playgroud)

编辑:事实上,我在以下行中收到此错误: $parse = $xml->children[0]->children[0]->toArray();

php error-handling try-catch

67
推荐指数
4
解决办法
8万
查看次数