在php 5中使用try-catch语句时需要考虑哪些性能影响?
我之前在网上看过一些关于这个主题的旧的,看似相互矛盾的信息.我目前必须使用的很多框架都是在php 4上创建的,并且缺少php 5的许多细节.所以,我自己在使用php的try-catchs时没有多少经验.
我最近接受过采访,面试官希望我做一个技术测试,看看我的知识.在我完成它之后,他给了我关于我是如何做到这一点的反馈,这是我没想到的,我很感激,因为如果他们不想雇用你,很少有采访者这样做.
他告诉我他告诉我他的代码不好的一件事是我在我编写的每个方法中使用了多个try-catch块.这引起了我的注意,因为我觉得它很有趣.
我相信目前我应该创建try-catch块,其中有一个语义可区分的代码块,它有一个或多个方法可以抛出需要捕获的异常.我遵循的唯一例外是,如果两个方法抛出相同的异常类型,我最好将它们放在不同的try-catch块中,以清楚地区分调试抛出异常的位置和原因.
这与采访者希望我做的完全不同.那么每种方法只使用一个try-catch块是一种已知的良好实践吗?如果这是一个众所周知的良好做法,这样做有什么好处?
编辑:我非常感谢您对此的看法,这非常好.虽然请注意我在问这是否是一个已知的良好做法.这是,如果大多数程序员都同意这一点,或者这是一本书中的好习惯
我已经阅读了一些关于tryCatch和cuzzins的其他SO问题,以及文档:
但我还是不明白.
我正在运行一个循环,next如果发生任何一种错误,我想跳过:
for (i in 1:39487) {
# EXCEPTION HANDLING
this.could.go.wrong <- tryCatch(
attemptsomething(),
error=function(e) next
)
so.could.this <- tryCatch(
doesthisfail(),
error=function(e) next
)
catch.all.errors <- function() { this.could.go.wrong; so.could.this; }
catch.all.errors;
#REAL WORK
useful(i); fun(i); good(i);
} #end for
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,没有next我能找到的文件)
当我跑步时,R鸣喇叭:
Error in value[[3L]](cond) : no loop for break/next, jumping to top level
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么基本点?这tryCatch显然是在for循环中,所以为什么不R知道呢?
从我的理解下面我写了不应该编译的语句代码"我不可达"是后return.
但是,编译绝对正常.
同样来自JLS:无法访问的语句,它不应该编译.
来自规范14.21无法到达的声明:
如果满足以下两个条件,则try语句可以正常完成:
try块可以正常完成,或者任何catch块都可以正常完成.
如果try语句有finally块,则finally块可以正常完成.
这里的try块无法正常完成,但catch块可以和finally块一样,所以我在这里很困惑
public class Test1 {
public static void main(String[] args) {
try {
return;
} catch (Exception e) {
System.out.println("catch");
} finally {
System.out.println("finally");
}
System.out.println("I am unreachable??!!!");
}
}
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解这种行为吗?
我相信这里
final int i;
try { i = calculateIndex(); }
catch (Exception e) { i = 1; }
Run Code Online (Sandbox Code Playgroud)
i如果控制到达catch-block,则可能无法分配.但是,Java编译器不同意并声称the final local variable i may already have been assigned.
我还缺少一些细微之处,或者这只是Java语言规范用于识别潜在重新分配的模型的弱点?我的主要担心是这样的事情Thread.stop(),这可能会导致异常被"凭空捏造"抛出,但我仍然看不到它如何在赋值后抛出,这显然是try-block中的最后一个动作.
如果允许,上面的成语将使我的许多方法更简单.请注意,此用例具有一流的语言支持,例如Scala,它始终使用Maybe monad:
final int i = calculateIndex().getOrElse(1);
Run Code Online (Sandbox Code Playgroud)
我认为这个用例是一个非常好的动机,允许一个特殊情况 肯定i是在catch块中未分配.
经过一番思考后,我更加确定这只是JLS模型的一个弱点:如果我在所提出的例子中声明了公理,i当控制到达catch-block时肯定是未分配的",它将不会与任何其他公理冲突或定理.编译器i在catch块中分配之前不允许任何读取,因此i无法查看是否已分配的事实.
在C#6.0中引入了"when"关键字,现在您可以在catch块中过滤异常.但是这不同于catch块中的if语句吗?如果是这样,是不是只是语法糖或我错过了什么?
例如,带有"when"关键字的try catch块:
try { … }
catch (WebException ex) when ex.Status == WebExceptionStatus.Timeout {
//do something
}
catch (WebException ex) when ex.Status== WebExceptionStatus.SendFailure {
//do something
}
catch (Exception caught) {…}
Run Code Online (Sandbox Code Playgroud)
要么
try { … }
catch (WebException ex) {
if(ex.Status == WebExceptionStatus.Timeout) {
//do something
}
}
catch (WebException ex) {
if(ex.Status == WebExceptionStatus.SendFailure) {
//do something
}
}
catch (Exception caught) {…}
Run Code Online (Sandbox Code Playgroud) Java中是否存在使用try/catch块的开销,而不是if块(假设所附的代码没有请求)?
例如,对字符串采用以下两种简单的"安全修剪"方法:
public String tryTrim(String raw) {
try {
return raw.trim();
} catch (Exception e) {
}
return null;
}
public String ifTrim(String raw) {
if (raw == null) {
return null;
}
return raw.trim();
}
Run Code Online (Sandbox Code Playgroud)
如果raw输入很少null,两种方法之间是否有任何性能差异?
此外,使用该方法简化代码布局是一种很好的编程模式tryTrim(),特别是当通过将代码封装在一个try/catch块中可以避免许多if块检查稀有错误条件时?
例如,一个常见的情况是使用一个方法N parameters,M <= N在其开始附近使用它们,如果任何这样的参数是"无效的"(例如,空或空字符串),则快速且确定地失败,而不影响其余的码.
在这种情况下,不必编写k * M if块(其中k每个参数的平均检查次数,例如k = 2对于null或空字符串),try/catch块将显着缩短代码并且可以使用1-2行注释明确地注意到"非常规"逻辑.
这样的模式也会加速该方法,特别是如果错误条件很少发生,并且它会这样做而不会影响程序安全性(假设错误条件是"正常"的,例如在字符串处理方法中为null或空值)是可以接受的,虽然很少存在).
我一直在玩一个我正在开发的系统,并设法让它导致这个:
致命错误:超出最长执行时间30秒
它发生在我做一些不切实际的事情时,但它可能发生在用户身上.
有谁知道是否有办法捕捉这个例外?我已经读过了,但似乎每个人都建议增加允许的时间.
由于最近存储在数据库中的数据不好,导致程序崩溃.这让我感到困惑,因为我觉得我有一个阻止这一点.
以下代码的目的是比较员工徽章编号并对其进行排序.如果出现错误,请返回-1并且士兵开启 - 请勿停止,因为数千个徽章编号中的一个错误:
public int compare(Employee t, Employee t1) {
Integer returnValue = -1;
try {
Integer tb = Integer.parseInt(t.getBadgeNumber());
Integer t1b = Integer.parseInt(t1.getBadgeNumber());
returnValue = tb.compareTo(t1b);
} catch (Exception e) {
returnValue = -1;//useless statement, I know.
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
当坏徽章编号被击中时(在这种情况下为t),我得到了一个"java.lang.IllegalArgumentException:比较方法违反了它的一般合同!" 错误而不是在catch中返回-1.
关于这里的捕获,我不明白什么?
完整的堆栈跟踪:
16-May-2018 14:28:53.496 SEVERE [http-nio-8084-exec-601] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [RequestServlet] in context with path [/AppearanceRequest] threw exception
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
at java.util.TimSort.sort(TimSort.java:223)
at java.util.TimSort.sort(TimSort.java:173) …Run Code Online (Sandbox Code Playgroud) 有什么区别:
catch
{
MessageBox.Show("Error.");
}
Run Code Online (Sandbox Code Playgroud)
和:
catch (Exception ex)
{
MessageBox.Show("Error.");
//we never use ex, so is it better to use catch without arguments?
}
Run Code Online (Sandbox Code Playgroud) try-catch ×10
java ×5
c# ×2
php ×2
c#-6.0 ×1
comparator ×1
exception ×1
fatal-error ×1
final ×1
if-statement ×1
overhead ×1
performance ×1
r ×1