我经常看到有关如何except: pass阻止使用的其他Stack Overflow问题的评论.为什么这么糟糕?有时我只是不在乎错误是什么,我想继续使用代码.
try:
something
except:
pass
Run Code Online (Sandbox Code Playgroud)
为什么使用except: pass块坏?是什么让它变坏?是因为我pass出错了还是我except有错误?
python error-handling exception-handling exception try-catch
好吧,我试图理解和阅读可能导致它的原因,但我无法得到它:
我在我的代码中有这个地方:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Run Code Online (Sandbox Code Playgroud)
事实是,当它试图调用某个方法时,它会抛出
InvocationTargetException而不是其他预期的异常(具体而言ArrayIndexOutOfBoundsException).因为我实际上知道调用了什么方法,所以我直接使用了这个方法代码,并为假设要抛出的行添加了一个try-catch块 ArrayIndexOutOfBoundsException,它确实ArrayIndexOutOfBoundsException按预期抛出.然而,当它上升时它以某种方式改变,InvocationTargetException并且在上面的代码中,catch(Exception e)
e InvocationTargetException并不ArrayIndexOutOfBoundsException
像预期的那样.
什么可能导致这样的行为或我如何检查这样的事情?
我通过反射调用一种可能导致异常的方法.如何在没有包装器反射的情况下将异常传递给调用者?
我正在重新抛出InnerException,但这会破坏堆栈跟踪.
示例代码:
public void test1()
{
// Throw an exception for testing purposes
throw new ArgumentException("test1");
}
void test2()
{
try
{
MethodInfo mi = typeof(Program).GetMethod("test1");
mi.Invoke(this, null);
}
catch (TargetInvocationException tiex)
{
// Throw the new exception
throw tiex.InnerException;
}
}
Run Code Online (Sandbox Code Playgroud) 我们通过将Exception.Message写入文件来记录系统中发生的任何异常.但是,它们是在客户的文化中写成的.而土耳其的错误对我来说意义不大.
那么如何在不改变用户文化的情况下用英语记录任何错误消息呢?
我有一个async不返回任何数据的方法:
public async Task MyAsyncMethod()
{
// do some stuff async, don't return any data
}
Run Code Online (Sandbox Code Playgroud)
我从另一个返回一些数据的方法调用它:
public string GetStringData()
{
MyAsyncMethod(); // this generates a warning and swallows exceptions
return "hello world";
}
Run Code Online (Sandbox Code Playgroud)
在MyAsyncMethod()没有等待的情况下进行呼叫会导致" 因为此呼叫未被等待,当前方法在呼叫完成之前继续运行 "在visual studio中发出警告.在该警告的页面上,它指出:
只有当您确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑禁止警告.
我确定我不想等待电话完成; 我不需要或没有时间.但这一呼吁可能引发例外.
我偶然发现了这个问题几次,我确信这是一个必须有共同解决方案的常见问题.
如何在不等待结果的情况下安全地调用异步方法?
对于那些建议我等待结果的人来说,这是响应我们的Web服务(ASP.NET Web API)上的Web请求的代码.在UI上下文中等待保持UI线程空闲,但是在Web请求调用中等待将在响应请求之前等待任务完成,从而无缘无故地增加响应时间.
我正在尝试以最简单的方式定义自己的异常类,这就是我得到的:
public class MyException extends Exception {}
public class Foo {
public bar() throws MyException {
throw new MyException("try again please");
}
}
Run Code Online (Sandbox Code Playgroud)
这就是Java编译器所说的:
cannot find symbol: constructor MyException(java.lang.String)
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,这个构造函数必须继承自己java.lang.Exception,不是吗?
我有时会看到
try {
} catch(Throwable e) {
}
Run Code Online (Sandbox Code Playgroud)
而有时
try {
} catch(Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
有什么不同
我正在和一位同事讨论如何从构造函数中抛出异常,并且我想要一些反馈.
从设计的角度来看,从构造函数中抛出异常是否可以?
假设我在一个类中包装一个POSIX互斥锁,它看起来像这样:
class Mutex {
public:
Mutex() {
if (pthread_mutex_init(&mutex_, 0) != 0) {
throw MutexInitException();
}
}
~Mutex() {
pthread_mutex_destroy(&mutex_);
}
void lock() {
if (pthread_mutex_lock(&mutex_) != 0) {
throw MutexLockException();
}
}
void unlock() {
if (pthread_mutex_unlock(&mutex_) != 0) {
throw MutexUnlockException();
}
}
private:
pthread_mutex_t mutex_;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是标准的方法吗?因为如果pthread mutex_init调用失败,则互斥对象不可用,因此抛出异常可确保不会创建互斥锁.
我是否应该为Mutex类创建一个成员函数init,并pthread mutex_init在其中调用将返回基于返回的bool pthread mutex_init?这样我就不必为这种低级对象使用异常.
记录填充消息和异常堆栈跟踪的正确方法是什么?
logger.error(
"\ncontext info one two three: {} {} {}\n",
new Object[] {"1", "2", "3"},
new Exception("something went wrong"));
Run Code Online (Sandbox Code Playgroud)
我想生成类似于此的输出:
context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...
Run Code Online (Sandbox Code Playgroud)
slf4j版本1.6.1
exception ×10
java ×4
c# ×3
.net ×2
c++ ×2
async-await ×1
c++-faq ×1
constructor ×1
finally ×1
inheritance ×1
invoke ×1
localization ×1
logging ×1
python ×1
raii ×1
reflection ×1
slf4j ×1
task ×1
throw ×1
throwable ×1
try-catch ×1