对try-catch块的思考你对代码的看法如下:;我看到的问题不是处理实际的错误,只是在另一个地方抛出异常。我发现它更难调试,因为我没有得到实际问题所在的行号。所以我的问题是为什么这很好?---编辑--从答案来看,大多数人都认为在不捕获自定义或特定异常的情况下执行此操作毫无意义。当没有捕获到特定异常时,这就是我要评论的内容。我可以看到实际处理捕获的异常的意义,而不是这段代码的方式。根据您所看到的质量,异常不会放置在不同的地方。没有目标的“throw”重新抛出异常,这与抛出异常非常不同。主要是重新抛出不会重置堆栈跟踪。在此特定示例中,捕获毫无意义,因为它不执行任何操作。异常被愉快地重新抛出,就好像try/catch不存在一样。我认为应该使用构造来处理您知道会在代码中抛出的异常;如果引发其他异常,则重新抛出。考虑投掷;不像扔;throwex会将堆栈截断到新的抛出点,丢失有关异常的有价值信息。publicvoiddoSomething(){try{//实际代码在这里}catch(EspecificExceptionex){HandleException(ex);}catch(Exceptionex){抛出;}}它不会,理想情况下catch块会做一些处理然后重新抛出,例如,try{//dosomething}catch(Exceptionex){DoSomething(ex);//处理抛出的异常;}当然,如果你想在你的代码的上层做一些进一步的处理,那么重抛就有用了。做这样的事情是没有意义的,一般来说我尽量不做废话;)在大多数情况下,我相信捕获你知道如何处理的特定类型的异常,即使它只是意味着用更多信息创建你自己的异常并将捕获的异常用作InnerException。有时这是合适的——当您要在调用堆栈的更高层处理异常时。但是,您需要在catch块中做一些事情,而不仅仅是重新抛出才有意义,例如记录错误:publicvoiddoSomething(){try{//实际代码在这里}catch(Exceptionex){LogException(前任);//记录错误...抛出;我见过像这样捕获genericexception然后将其重新打包到自定义异常对象中的实例。它与您所说的不同之处在于,这些自定义Exception对象包含有关实际发生的异常的更多信息,而不是更少。对于初学者,我只是做catch{throw;但基本上,如果您正在捕获多种类型的异常,您可能希望在本地处理一些异常,而其他的则备份堆栈。例如catch(SQLExceptionsex)//哈哈{DoStuff(sex);}抓住{扔;}取决于你所说的“看起来像这样”是什么意思,如果catch块中没有其他东西但重新抛出......如果是这样的话,trycatch是没有意义的,除了,正如你所说,混淆异常发生的地方.但是如果你需要在那里做一些事情,在发生错误的地方,但又想处理异常,那么这可能是合适的。但是话又说回来,捕获将针对您正在处理的特定异常,而不是针对任何异常,我认为重新抛出错误不会有用。除非你一开始就不关心错误。我认为在捕获中实际做一些事情会更好。您可以查看MSDN异常处理指南。通常,不执行任何操作的异常处理块并不好,因为它会阻止.Net虚拟机在优化代码性能的同时内联您的方法。关于为什么您在ScottHanselman上看到“ReleaseNotDebug:64位优化和C#方法内联Release构建调用堆栈”的完整文章每个人都很有用,需要了解更多有关C#的学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
