可以任你解释的区别是什么之间throw,throws以及Throwable和什么时候使用?
PEP 342(通过增强型生成器的协程)throw()向生成器对象添加了一个方法,它允许调用者在生成器内引发异常(就好像它是由yield表达式抛出的).
我想知道这个功能的用例是什么.
我发现有三种方法可以捕获异常,有什么区别?
1)按价值捕获;
2)引用参考;
3)用指针抓住;
我只知道按值捕获将调用该对象的两个副本,通过引用捕获将调用一个.那么指针捕获怎么样?什么时候用指针捕捉?除了抛出一个对象,我可以抛出一个像这样的对象的指针吗?
class A {}
void f() {
A *p = new A();
throw p;
}
Run Code Online (Sandbox Code Playgroud) 通过阅读本节,我发现了一种"技术",作者称之为"异常调度程序",允许某人将所有异常处理分组到一个方便的函数中:
void handleException()
{
try {
throw; // ?!
}
catch (MyException& e) {
//...code to handle MyException...
}
catch (YourException& e) {
//...code to handle YourException...
}
}
void f()
{
try {
//...something that might throw...
}
catch (...) {
handleException();
}
}
Run Code Online (Sandbox Code Playgroud)
困扰我的是单一throw;陈述:如果你考虑给定的例子然后肯定,它显然是做什么的:它重新抛出首先陷入的异常f()并再次处理它.
但是,如果我handleException()直接调用它,而不是从一个catch()条款中做到这一点怎么办?有没有指定的行为?
此外,对于奖励积分,throw你知道的还有其他"怪异"(可能不是好词)的使用吗?
谢谢.
throws关键字是对Swift最大的误解.考虑以下代码:
func myUsefulFunction() throws
Run Code Online (Sandbox Code Playgroud)
我们无法真正理解它会抛出什么样的错误.我们唯一知道的是它可能会引发一些错误.了解错误可能的唯一方法是查看文档或在运行时检查错误.
但这不是针对斯威夫特的本性吗?Swift具有强大的泛型和类型系统,可以使代码具有表现力,但感觉就好像throws完全相反,因为您无法从查看函数签名中获得有关错误的任何信息.
为什么会这样?或者我错过了重要的事情并误解了这个概念?
当有后置条件时,方法的返回值不能为空,可以做什么?
我可以
assert returnValue != null : "Not acceptable null value";
Run Code Online (Sandbox Code Playgroud)
断言可以关闭!
所以可以这样做
if(returnValue==null)
{
throw new NullPointerException("return value is null at method AAA");
}
Run Code Online (Sandbox Code Playgroud)
?
或者,对于这样的条件,使用用户定义的异常(如NullReturnValueException)会更好吗?
目前我正在通过错误处理扩展我的JavaScript项目.该throw声明在这里发挥了重要作用:
throw new Error("text"); // Error: text
Run Code Online (Sandbox Code Playgroud)
但是,我还可以发出警告吗?我尝试了以下无济于事:
throw new Warning("text"); // Warning is not defined
Run Code Online (Sandbox Code Playgroud)
错误使Chrome的开发人员工具显示红叉,但如何让它显示警告图标(黄色感叹号)?
正如我在cppreference中看到的那样 ,经典的"throw"声明列表现在已在C++ 11中弃用.离开这个机制的原因是什么?我应该如何指定抛出我的函数的异常?
可能重复:
通过断言或异常的合同测试设计?
在决定使用异常而不是断言时(或反之亦然),是否遵循经验法则.现在我只会抛出我认为会在用户端运行时发生的事情(如套接字或文件错误).我使用的几乎所有其他东西都断言.
另外,如果我要抛出一个断言,那么抛出一个很好的标准对象是什么?IIRC有std :: logic_error但是这不是一个好的对象吗?我会丢失文件或意外输入(例如从命令行而不是前端应用程序)?
THROW在T-SQL存储过程中使用语句时,我面临着名的"不正确的语法" .我用Google搜索并检查了StackOverflow上的问题,但提出的解决方案(奇怪的是,接受了)对我不起作用.
我正在修改存储过程如下:
ALTER PROCEDURE [dbo].[CONVERT_Q_TO_O]
@Q_ID int = NULL,
@IDENTITY INT = NULL OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @EXISTING_RECORD_COUNT [int];
SELECT
@EXISTING_RECORD_COUNT = COUNT (*)
FROM
[dbo].[O]
WHERE
[Q_ID] = @Q_ID
IF @EXISTING_RECORD_COUNT = 0
BEGIN
-- DO SOME STUFF HERE
-- RETURN NEW ID
SELECT @IDENTITY = SCOPE_IDENTITY()
END
ELSE
BEGIN
THROW 99001, 'O associated with the given Q Id already exists', 1;
END
END
GO
Run Code Online (Sandbox Code Playgroud)
当我编写这个T-SQL时,我得到一个错误说
"THROW"附近的错误陈述.期待对话,对话,分发或交易
所有解决方案都建议在'THROW'之前或'ELSE BEGIN'语句之后放置一个分号.当我修改T-SQL时,我只是在'THROW'附近得到" 错误的语句 "错误,似乎无法找到解决方案.
有什么建议?