我一直在研究一款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)我一直在我的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编码数组.我只是认为在我的示例中放置特定代码不会增加任何值.
在决定是否向方法添加throws
子句或使用try-catch
?时,一般的经验法则是什么?
从我自己阅读的内容来看,throws
应该在调用者违反合同结束时使用(传递对象),并且try-catch
在方法内执行操作期间发生异常时应该使用.它是否正确?如果是这样,应该在呼叫者方面做些什么?
PS:通过谷歌和搜索引擎优化搜索,但希望得到一个明确的答案.
由于在使用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)
我已经在error
和exit
事件中使用了侦听器,但是如果出现此错误,则不会触发它们.
我的代码:
zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... });
Run Code Online (Sandbox Code Playgroud)
完整源代码可用.
有什么办法可以防止脚本崩溃吗?如何捕获抛出的ENOMEM错误?
谢谢!
在尝试多捕获功能时,我在我的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) 我在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块中抛出.
提前致谢!
请考虑以下代码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中自己测试过.但是,请随时回答!
如何在Scala中同时捕获多个异常?有没有比C#更好的方法:一次捕获多个异常?
scala exception-handling exception try-catch pattern-matching
我需要在第三方库清理操作中捕获分段错误.这有时会在我的程序退出之前发生,我无法解决这个问题的真正原因.在Windows编程中,我可以使用__try - __catch执行此操作.是否有跨平台或平台特定的方式来做同样的事情?我需要在Linux,gcc中使用它.
我想抓住这个错误:
$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();