相关疑难解决方法(0)

抛出异常时中断

Visual Studio has an option to break automatically into the debugger when an unhandled exception is thrown, does Eclipse have similar functionality?

java eclipse debugging eclipse-jdt

241
推荐指数
2
解决办法
7万
查看次数

处理未处理的异常问题

我想为我可能没有在代码中捕获的所有意外异常设置一些处理程序.在Program.Main()我使用以下代码:

AppDomain.CurrentDomain.UnhandledException
    += new UnhandledExceptionEventHandler(ErrorHandler.HandleException);
Run Code Online (Sandbox Code Playgroud)

但它并没有像我预期的那样奏效.当我在调试模式下启动应用程序并抛出异常时,它确实调用了处理程序,但之后Visual Studio中的异常帮助程序弹出,好像发生了异常而没有任何处理.我在处理程序中尝试了Application.Exit(),但它也没有用.

我想要实现的是异常是用我的处理程序处理的,然后应用程序很好地关闭.有没有其他方法可以做到这一点,还是我以错误的方式使用上面的代码?

c# exception

37
推荐指数
3
解决办法
5万
查看次数

如何在没有尝试的情况下检查File.Delete()是否会成功,在C#中?

在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().

.net c# security permissions

30
推荐指数
2
解决办法
2万
查看次数

.NET和C#异常.抓住什么是合理的

免责声明,我来自Java背景.我没有做太多的C#.这两个世界之间存在大量的转移,但当然存在差异,其中一个是异常倾向于被考虑的方式.

我最近回答了一个C#问题,建议在某些情况下,这样做是合理的:

 try {
   some work
 } catch (Exeption e) {
       commonExceptionHandler();
 }
Run Code Online (Sandbox Code Playgroud)

(原因不重要).我收到的答复我不太明白:

直到.NET 4.0,捕获异常非常糟糕.这意味着你可以捕获各种低级致命错误,从而掩盖错误.它还意味着如果某种类型的损坏触发了这样的异常,堆栈上的任何打开的finally块都将被执行,所以即使callExceptionReporter函数尝试记录并退出,它甚至可能无法到达那一点( finally块可能再次抛出,或导致更多损坏,或从磁盘或数据库中删除重要的东西).

我可能比我意识到的更困惑,但我不同意其中的一些.请其他人评论.

  1. 我知道有很多低级别的例外我们不想接受.我的commonExceptionHandler()函数可以合理地重新抛出那些.这似乎与对相关问题的答案一致.这说"根据你的上下文,使用catch(...)是可以接受的,只要重新抛出异常即可." 所以我总结使用catch(Exception)并不总是邪恶,默默地吞下某些例外.

  2. 短语"在.NET 4之前它对Catch Exception来说非常糟糕".NET 4中有哪些变化?这是对AggregateException的引用,它可能会给我们一些与我们捕获的异常有关的新事物,但我不认为更改是基本的"不要吞下"规则.

  3. 下一句话真的很麻烦.这可能是对的吗?

它还意味着如果某种类型的损坏触发了这样的异常,堆栈上的任何打开的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执行最终的原因

c# exception-handling

12
推荐指数
3
解决办法
1094
查看次数

C#中的常规异常处理

我正在通过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.

这是非常糟糕的做法还是应该/我能否安全地忽略这种违规行为?

c# exception-handling

7
推荐指数
2
解决办法
1万
查看次数

如何处理未经检查的异常?

Java有编译器检查异常.当我转换到C++时,我了解到它没有检查异常.起初,我一直在使用异常处理,因为它是一个很棒的功能.但是,过了一段时间我放弃了它,因为我遇到了一种情况,每个函数都可能抛出异常.由于我编写的函数中只有一小部分可以抛出异常(比如说最多只有25%),我发现对不能抛出任何不可接受的函数进行异常处理的开销.

因此,我很惊讶有很多开发人员更喜欢未经检查的异常.因此,我很想知道他们是如何处理这个问题的.如果语言不支持检查异常,您如何避免执行不必要的异常处理的开销

备注:我的问题同样适用于C++和C#,也可能适用于所有其他不具备编译器检查异常处理功能的语言.

c# java exception-handling exception

5
推荐指数
2
解决办法
1141
查看次数