Visual Studio has an option to break automatically into the debugger when an unhandled exception is thrown, does Eclipse have similar functionality?
我想为我可能没有在代码中捕获的所有意外异常设置一些处理程序.在Program.Main()我使用以下代码:
AppDomain.CurrentDomain.UnhandledException
+= new UnhandledExceptionEventHandler(ErrorHandler.HandleException);
Run Code Online (Sandbox Code Playgroud)
但它并没有像我预期的那样奏效.当我在调试模式下启动应用程序并抛出异常时,它确实调用了处理程序,但之后Visual Studio中的异常帮助程序弹出,好像发生了异常而没有任何处理.我在处理程序中尝试了Application.Exit(),但它也没有用.
我想要实现的是异常是用我的处理程序处理的,然后应用程序很好地关闭.有没有其他方法可以做到这一点,还是我以错误的方式使用上面的代码?
在C#中,System.IO.File.Delete(filePath)将删除指定的文件,或引发异常.如果当前用户没有删除文件的权限,则会引发UnauthorizedAccessException.
有没有什么方法可以提前判断删除是否可能抛出UnauthorizedAccessException(即查询ACL以查看当前线程的标识是否有权删除指定的文件?)
我基本上是想做:
if (FileIsDeletableByCurrentUser(filePath)) {
/* remove supporting database records, etc. here */
File.Delete(filePath);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何实现FileIsDeletableByCurrentUser().
免责声明,我来自Java背景.我没有做太多的C#.这两个世界之间存在大量的转移,但当然存在差异,其中一个是异常倾向于被考虑的方式.
我最近回答了一个C#问题,建议在某些情况下,这样做是合理的:
try {
some work
} catch (Exeption e) {
commonExceptionHandler();
}
Run Code Online (Sandbox Code Playgroud)
(原因不重要).我收到的答复我不太明白:
直到.NET 4.0,捕获异常非常糟糕.这意味着你可以捕获各种低级致命错误,从而掩盖错误.它还意味着如果某种类型的损坏触发了这样的异常,堆栈上的任何打开的finally块都将被执行,所以即使callExceptionReporter函数尝试记录并退出,它甚至可能无法到达那一点( finally块可能再次抛出,或导致更多损坏,或从磁盘或数据库中删除重要的东西).
我可能比我意识到的更困惑,但我不同意其中的一些.请其他人评论.
我知道有很多低级别的例外我们不想接受.我的commonExceptionHandler()函数可以合理地重新抛出那些.这似乎与对相关问题的答案一致.这说"根据你的上下文,使用catch(...)是可以接受的,只要重新抛出异常即可." 所以我总结使用catch(Exception)并不总是邪恶,默默地吞下某些例外.
短语"在.NET 4之前它对Catch Exception来说非常糟糕".NET 4中有哪些变化?这是对AggregateException的引用,它可能会给我们一些与我们捕获的异常有关的新事物,但我不认为更改是基本的"不要吞下"规则.
下一句话真的很麻烦.这可能是对的吗?
它还意味着如果某种类型的损坏触发了这样的异常,堆栈上的任何打开的finally块都将被执行(finally块可能再次抛出,或导致更多损坏,或从磁盘或数据库中删除重要的东西)
我的理解是,如果有一些低级代码
lowLevelMethod() {
try {
lowestLevelMethod();
} finally {
some really important stuff
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中我调用lowLevel();
try {
lowLevel()
} catch (Exception e) {
exception handling and maybe rethrowing
}
Run Code Online (Sandbox Code Playgroud)
无论我是否捕获异常,这对于finally块的执行都没有任何影响.当我们离开lowLevelMethod()时,finally已经运行了.如果最终要做任何坏事,比如我的磁盘损坏,那么它会这样做.我捕捉异常没有任何区别.如果它到达我的异常块我需要做正确的事情,但我不能成为dmis执行最终的原因
我正在通过FxCop运行一些代码,目前正在考虑清除所有非破坏性违规.
代码本身有一些try/catch块实例,它们只捕获一般异常;
try
{
// Some code in here that could throw an exception
}
catch(Exception ex)
{
// Exception Thrown ... sort it out!
}
Run Code Online (Sandbox Code Playgroud)
现在我们都知道这是不好的做法,但我认为我知道如何正确地做到这一点 - 但FxCop还有其他想法!
假设try块中的代码可能抛出IO异常 - 并且只有IO异常.这样做应该没有错:
try
{
// Code in here that can only throw an IOException
}
catch (System.IO.IOException ioExp)
{
// Handle the IO exception or throw it
}
catch (System.Exception ex)
{
// Catch otherwise unhandled exception
}
Run Code Online (Sandbox Code Playgroud)
但是FxCop不同意我的观点......它仍然将此标记为违规,因为我正在追赶System.Exception.
这是非常糟糕的做法还是应该/我能否安全地忽略这种违规行为?
Java有编译器检查异常.当我转换到C++时,我了解到它没有检查异常.起初,我一直在使用异常处理,因为它是一个很棒的功能.但是,过了一段时间我放弃了它,因为我遇到了一种情况,每个函数都可能抛出异常.由于我编写的函数中只有一小部分可以抛出异常(比如说最多只有25%),我发现对不能抛出任何不可接受的函数进行异常处理的开销.
因此,我很惊讶有很多开发人员更喜欢未经检查的异常.因此,我很想知道他们是如何处理这个问题的.如果语言不支持检查异常,您如何避免执行不必要的异常处理的开销?
备注:我的问题同样适用于C++和C#,也可能适用于所有其他不具备编译器检查异常处理功能的语言.
c# ×5
exception ×2
java ×2
.net ×1
debugging ×1
eclipse ×1
eclipse-jdt ×1
permissions ×1
security ×1