我需要找到一种方法(请使用C++ 03,不能使用C++ 11)来删除gcc对以下(伪)代码产生的警告:
#include <stdexcept>
void throw_invalid()
{
throw std::invalid_argument( "invalid" );
}
int foo(const char * str)
{
if( str ) return 42;
throw_invalid();
// insert portable -fake- code that will get optimized away
}
Run Code Online (Sandbox Code Playgroud)
我的代码需要至少在gcc 5.x(-Wall)和Visual Studio上免费警告.我的throw_invalid功能是避免锅炉板代码,并将异常集中在与无效参数相关的单个函数中.
目前的警告是:
$ g++ -Wall -c foo.cxx
b.cxx: In function ‘int foo(const char*)’:
b.cxx:13:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
Run Code Online (Sandbox Code Playgroud)
我想避免添加假return -1(从未到达),因为它使代码更难阅读.
我知道使用next()方法将迭代器前进到yield关键字的下一个位置,并返回包含yield表达式结果的对象,如下所示:
产量增加一倍(40);=>调用iterator.next()将返回类似{done:false,value:80}的信息
但是,我不太清楚throw()方法是否还会将迭代器前进并返回下一个yield的表达式,除了将异常抛出到生成器中。文档说像这样:
throw()方法通过向生成器中抛出错误来恢复生成器的执行,并返回一个对象,该对象具有完成的两个属性和值。
当我们调用iterator.throw()时,是否会将异常抛出到生成器中(正确捕获了异常),并前进到下一个yield关键字并返回yield表达式的结果?
请让我知道是否需要包含代码片段来演示这一点,因为这是我在Stackoverflow上的第一篇文章。
谢谢!!!
如何在PowerShell中使用'throw'方向来抛出自定义数据对象的异常?说,它能做到吗?:
throw 'foo', $myData
Run Code Online (Sandbox Code Playgroud)
那么数据可以用在'catch'逻辑中:
catch {
if ($_.exception.some_property -eq 'foo') {
$data = $_.exception.some_field_to_get_data
# dealing with data
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我的目的是知道是否有一个简短而酷的语法来抛出异常(没有显式创建我自己的类型),其名称我可以通过其名称来决定并在'catch'块中处理它的数据.
当我在代码中跨越断点时,我遇到了调试器的奇怪行为:
public async Task DoSomeWork()
{
await Task.Run(() => { Thread.Sleep(1000); });
var test = false;
if (test)
{
throw new Exception("Im in IF body!");
}
}
Run Code Online (Sandbox Code Playgroud)
调试器进入if正文.值得注意的是,异常并没有被抛出,只是看起来就是这样.因此,如果您正确放置断点,则无法重现throw.你必须将它放在上面并向下走到if身体才能抓住它.同样适用于任何类型的异常实例(以及显式null),甚至可以return代替throw.
除此之外它即使我删除行也可以工作await.
我试图从不同的PC运行此代码片段,因此它不是PC的麻烦.另外我认为它是VS代码中的错误,并试图在JetBrains的Rider中运行它 - 结果相同.
我确定这是异步的事情,但它是如何明确地起作用的?
我在理解现有代码时遇到问题。我想知道 Java 如何管理抛出异常并以相同的方法捕获它。我在其他问题中找不到它,所以我准备了一个例子。在 Java 中运行下面的代码会输出什么?
public static void main(String [ ] args) {
try{
System.out.println("1");
method();
}
catch(IOException e) {
System.out.println("4");
}
}
public static void method() throws IOException {
try {
System.out.println("2");
throw new IOException();
}
catch(IOException e) {
System.out.println("3");
}
}
Run Code Online (Sandbox Code Playgroud)
它会是1 2 3还是1 2 4?
如此处所述 - Scala编程的第7章,内置控制结构,7.4使用try表达式进行异常处理:
在Scala中,throw是一个具有结果类型的表达式.
从技术上讲,异常抛出类型
Nothing.你可以使用throw作为表达式,即使它实际上永远不会评估任何东西.这一点技术体操可能听起来很奇怪,但在前面的例子中经常有用.if的一个分支计算一个值,而另一个分支抛出异常并计算Nothing.整个if表达式的类型是那个计算某事物的分支的类型.
例子是:
val half =
if (n % 2 == 0)
n / 2
else
throw new RuntimeException("n must be even")
Run Code Online (Sandbox Code Playgroud)
然后我去Scala尝试:
scala> val n = 1
n: Int = 1
scala> val half = if (n % 2 == 0) n / 2 else throw new RuntimeException("n must be even")
java.lang.RuntimeException: n must be even
... 29 elided
scala> half
<console>:12: error: not found: value half
half
^
Run Code Online (Sandbox Code Playgroud)
据说half …
昨天找到的东西让我意识到我很可能仍然缺少关于C#的基本花絮.
我有一个无状态服务结构应用程序.我在主循环中有一个尝试捕获.如果我在这个循环中抛出一个异常,它会跳出while循环并且服务有效地停止.如果我throw向catch子句添加一个,则服务将重新启动.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
try
{
long iterations = 0;
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(3), cancellationToken).ConfigureAwait(false);
// Do stuff...
if (iterations > 4) {
throw new Exception();
}
ServiceEventSource.Current.ServiceMessage(this.Context, $"Working-{++iterations}");
}
}
catch (Exception ex)
{
// Log stuff...
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这是或指示我到哪里可以得到答案?我找不到任何可以解释这种行为的东西.
编辑:这不是重复是什么"投掷"和"投掷前"之间有什么区别?因为,据我所见,它没有解释我的问题,为什么函数再次运行.该主题更多的是解释之间的区别throw和throw new各自的堆栈跟踪.
我正在尝试测试 EXPECT_THROW,如下所示。
#include <gtest/gtest.h>
int Foo(int a, int b){
if (a == 0 || b == 0){
throw "don't do that";
}
int c = a % b;
if (c == 0)
return b;
return Foo(b, c);
}
TEST(FooTest, Throw2){
EXPECT_THROW(Foo(0,0), char*);
}
int main(int argc, char* argv[]){
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)
我预计“Throw2”应该成功。但它给出了这个错误信息:
Expected: Foo(0,0) throws an exception of type char*.
Actual: it throws a different type.
Run Code Online (Sandbox Code Playgroud)
那么这里抛出的类型是什么?
我正在前端工作,并测试我的库,我收到一个预期的错误,但我无法做出断言。我有下一个代码:
it('If the username is not entered, I get an error', () => {
try {
new SDK('test', {
password: 'aaaabbbbcccc',
key: 'ddddeeefff',
});
} catch (error) {
expect(error).toThrow(
`Error: The 'username' property has not been entered`
);
}
});
Run Code Online (Sandbox Code Playgroud)
如您所见,为了对我的库进行身份验证,我需要:用户名、密码和密钥。这是我得到的错误:
谢谢你!
throw ×10
c# ×3
exception ×3
c++ ×2
javascript ×2
asynchronous ×1
debugging ×1
gcc ×1
generator ×1
googletest ×1
java ×1
jestjs ×1
matcher ×1
portability ×1
powershell ×1
rethrow ×1
return ×1
scala ×1
testing ×1
try-catch ×1