我试图了解fin = open("ids","r") #Read the file
for line in fin: #Split lines
string = str.split()
if len(string) > 1: #Seperate names and grades
id = map(int, string[0]
name = string[1:]
print(id, name) #Print results
执行流程的工作原理。 Stack Overflow用户有一些关于其执行流程的解决方案。
一个这样的例子是:
try-catch-finally
代码A将被执行。如果一切顺利(即在执行A时没有异常被抛出),它将转到
try { // ... some code: A } catch(...) { // ... exception code: B } finally { // finally code: C }
,因此代码C将被执行。如果在执行A时抛出异常,则它将转到B,然后转到C。
然而,当我尝试时,我得到了不同的执行流程:
finally
我得到两个不同的输出:
首先输出:
try {
int a=4;
int b=0;
int c=a/b;
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally {
System.out.println("common");
}
然而,当我第二次运行相同的程序时:
第二次输出:
java.lang.ArithmeticException: / by zero
at substrings.main(substrings.java:15)
lication.AppMain.main(AppMain.java:140)
common
我应该从中得出什么结论?这是随机的吗?
答案 0 :(得分:42)
printStackTrace()
输出到标准错误。 System.out.println("common")
输出到标准输出。它们都被路由到同一个控制台,但它们在该控制台上出现的顺序不一定是它们执行的顺序。
如果你在catch块和finally块中都写入相同的流(例如,try System.err.println("common")
),你会看到catch块总是在finally块被捕获之前执行。
答案 1 :(得分:7)
例外&n; printstacktrace()
方法源代码(在Throwable
类中定义)
public void printStackTrace() {
printStackTrace(System.err);
}
输出的格式化是因为您正在使用标准输出流System.out.println
而异常发生System.err
流
尝试使用一个变量来检查异常并在异常发生时在同一个错误控制台中打印: -
boolean isException = false;
try {
int a=4;
int b=0;
int c=a/b;
}
catch (Exception ex)
{
isException = true
ex.printStackTrace();
}
finally {
if(isException){
System.err.println("common");
}else{
System.out.println("common");
}
}