我正在关注Coursera的Scala课程.我也开始阅读Odersky的Scala书.
我经常听到的是,在函数式语言中抛出异常并不是一个好主意,因为它会破坏控制流,我们通常会返回一个带有失败或成功的Either.似乎Scala 2.10也将提供那个方向的Try.
但是在书和课程中,马丁奥德斯基似乎并没有(至少现在)说异常是坏的,而且他经常使用它们.我也注意到方法断言/要求......
最后我有点困惑,因为我想遵循最佳实践,但他们不清楚,语言似乎是双向的...
有人可以解释一下我应该在哪种情况下使用什么?
我发现有三种方法可以捕获异常,有什么区别?
1)按价值捕获;
2)引用参考;
3)用指针抓住;
我只知道按值捕获将调用该对象的两个副本,通过引用捕获将调用一个.那么指针捕获怎么样?什么时候用指针捕捉?除了抛出一个对象,我可以抛出一个像这样的对象的指针吗?
class A {}
void f() {
A *p = new A();
throw p;
}
Run Code Online (Sandbox Code Playgroud) 如果在using语句中发生异常,该对象是否仍然处理?
我问的原因是因为我试图决定是否在整个代码块或内部使用语句中进行尝试.请记住,某些例外情况正在设计中被重新抛出.
using (SPSite spSite = new SPSite(url))
{
// Get the Web
using (SPWeb spWeb = spSite.OpenWeb())
{
// Exception occurs here
}
}
Run Code Online (Sandbox Code Playgroud) 在C#,尝试捕获最终如何阻止工作?
所以如果有异常,我知道它将跳转到catch块然后跳转到finally块.
但是,如果没有错误,catch块将不会运行,但finally块是否会运行呢?
我是第一个C++编程类的学生,我正在开发一个项目,我们必须创建多个自定义异常类,然后在我们的一个事件处理程序中,使用一个try/catch块来适当地处理它们.
我的问题是:如何在我的块中捕获多个自定义异常try/catch?GetMessage()是我的异常类中的自定义方法,它将异常解释作为a返回std::string.下面我已经包含了我项目中的所有相关代码.
谢谢你的帮助!
try/catch块
// This is in one of my event handlers, newEnd is a wxTextCtrl
try {
first.ValidateData();
newEndT = first.ComputeEndTime();
*newEnd << newEndT;
}
catch (// don't know what do to here) {
wxMessageBox(_(e.GetMessage()),
_("Something Went Wrong!"),
wxOK | wxICON_INFORMATION, this);;
}
Run Code Online (Sandbox Code Playgroud)
ValidateData()方法
void Time::ValidateData()
{
int startHours, startMins, endHours, endMins;
startHours = startTime / MINUTES_TO_HOURS;
startMins = startTime % MINUTES_TO_HOURS;
endHours = endTime / MINUTES_TO_HOURS;
endMins …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个具有事务和try/catch块的MS sql脚本.如果它捕获异常,则回滚事务.如果不是,则提交事务.我看过几个不同的网站说这样做:
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
end catch
commit transaction
Run Code Online (Sandbox Code Playgroud)
但即使在捕获异常的情况下,我们仍然不会点击"提交事务"行吗?这不会导致SQL错误,因为事务已经回滚了吗?我认为应该这样做:
declare @success bit = 1
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
set @success = 0
end catch
if(@success = 1)
begin
commit transaction
end
Run Code Online (Sandbox Code Playgroud)
普遍发布的解决方案如何不包含@success变量?提交已经回滚的事务是否没有发生sql错误?我是否错误地说在捕获异常的情况下仍然会遇到第一个代码示例的"提交事务"行?
我最近编写了一个功能很好的PowerShell脚本 - 但是,我现在想升级脚本并添加一些错误检查/处理 - 但我似乎已经陷入了第一道障碍.为什么以下代码不起作用?
try {
Remove-Item "C:\somenonexistentfolder\file.txt" -ErrorAction Stop
}
catch [System.Management.Automation.ItemNotFoundException] {
"item not found"
}
catch {
"any other undefined errors"
$error[0]
}
finally {
"Finished"
}
Run Code Online (Sandbox Code Playgroud)
错误被捕获在第二个catch块中 - 您可以看到输出$error[0].显然我想在第一个区块中抓住它.我错过了什么?
throws关键字是对Swift最大的误解.考虑以下代码:
func myUsefulFunction() throws
Run Code Online (Sandbox Code Playgroud)
我们无法真正理解它会抛出什么样的错误.我们唯一知道的是它可能会引发一些错误.了解错误可能的唯一方法是查看文档或在运行时检查错误.
但这不是针对斯威夫特的本性吗?Swift具有强大的泛型和类型系统,可以使代码具有表现力,但感觉就好像throws完全相反,因为您无法从查看函数签名中获得有关错误的任何信息.
为什么会这样?或者我错过了重要的事情并误解了这个概念?
# Open new file to write
file = None
try:
file = open(filePath, 'w')
except IOError:
msg = ("Unable to create file on disk.")
file.close()
return
finally:
file.write("Hello World!")
file.close()
Run Code Online (Sandbox Code Playgroud)
上面的代码是从函数中删除的.用户的一个系统正在报告错误:
file.write("Hello World!")
Run Code Online (Sandbox Code Playgroud)
错误:
AttributeError: 'NoneType' object has no attribute 'write'
Run Code Online (Sandbox Code Playgroud)
问题是,如果python未能打开给定文件,'except'块执行并且必须返回,但是控制将转移到抛出给定错误的行.'file'变量的值为'None'.
有什么指针吗?
当我return在一个finally语句块中放置一个时,编译器会告诉我:
控制不能离开finally子句的主体
例:
try
{
}
catch
{
}
finally
{
return;
}
Run Code Online (Sandbox Code Playgroud)
为什么是这样?