天道酬勤,学无止境

为什么 ControlCollection 不抛出 InvalidOperationException?(Why does ControlCollection NOT throw InvalidOperationException?) 相关文章

原文信息:为什么 ControlCollection 不抛出 InvalidOperationException?(Why does ControlCollection NOT throw InvalidOperationException?)

问题 按照这个问题 Foreach 循环处理跳过迭代的控件,它让我觉得在不断变化的集合上允许迭代: 例如,以下内容: List<Control> items = new List<Control> { new TextBox {Text = "A", Top = 10}, new TextBox {Text = "B", Top = 20}, new TextBox {Text = "C", Top = 30}, new TextBox {Text = "D", Top = 40}, }; foreach (var item in items) { items.Remove(item); } 投掷 InvalidOperationException:集合被修改; 枚举操作可能无法执行。 但是,在 .Net 表单中,您可以执行以下操作: this.Controls.Add(new TextBox {Text = "A", Top = 10}); this.Controls.Add(new TextBox {Text = "B", Top = 30}); this.Controls.Add(new TextBox {Text = "C", Top = 50}); this.Controls.Add(new TextBox {Text = "D", Top = 70}); foreach


更多相关搜索:点击搜索查看



Why does ControlCollection NOT throw InvalidOperationException?
Following this question Foreach loop for disposing controls skipping iterations it bugged me that iteration was allowed over a changing collection: For example, the following: List<Control> items = new List<Control> { new TextBox {Text = "A", Top = 10}, new TextBox {Text = "B", Top = 20}, new TextBox {Text = "C", Top = 30}, new TextBox {Text = "D", Top = 40}, }; foreach (var item in items) { items.Remove(item); } throws InvalidOperationException: Collection was modified; enumeration operation may not execute. However in a .Net Form you can do: this.Controls.Add(new TextBox {Text = "A", Top =

2021-07-11 05:15:53    分类:问答    c#   .net   winforms   foreach   invalidoperationexception

为什么 std::stof 在传递无法转换的参数时不抛出?(Why does std::stof not throw when passed an argument it cannot convert?)
问题 我正在处理一个项目,我想在其中接受{float}{single-letter-identifier}形式的输入,例如15.6E或10W 。 为此,我认为我可以获取输入字符串, std::stof最后一个字母,然后检查是否可以使用std::stof执行转换为浮点数。 这将嵌套在try-catch块中,并允许我通知用户输入无效。 此处 STL 的开放标准(第 653 页)指出std::stof抛出: invalid_argument如果 wcstod 或 wcstold 报告无法执行转换。 但是,它在传递无法转换的内容时不会抛出,例如"48East" 。 重现此行为的代码示例如下: std::wstring szString = L"48East"; try{ float f = std::stof(szString); } catch( ... ) { std::cout << "test" << std::endl; } 这是在 MSVC10 上使用/Od在调试模式下编译的,所以我假设调用没有被优化掉。 我很感激任何帮助(或关于我误解/误读规范的地方的指导!)。 回答1 当我阅读它时, stof尽可能多地转换输入字符串,直到找到无法转换的内容。 如果它不能转换任何东西,它会抛出invalid_argument 。 回答2 MSVC 实现从头开始解析有效字符并成功转换它们

2021-07-10 02:22:01    分类:技术分享    c++   visual-c++   stl

当项目在枚举时发生变化会影响枚举吗?(When items change while being enumerated does it affects the enumeration?)
问题 想象一下,在一个 foreach(var item in enumerable) 可枚举项发生变化。 会影响当前的foreach吗? 例子: var enumerable = new List<int>(); enumerable.Add(1); Parallel.ForEach<int>(enumerable, item => { enumerable.Add(item + 1); }); 它会永远循环吗? 回答1 通常,它应该抛出异常。 GetEnumerator() 的List<T>实现提供了一个Enumerator<T>对象,其MoveNext()方法如下所示(来自 Reflector): public bool MoveNext() { List<T> list = this.list; if ((this.version == list._version) && (this.index < list._size)) { this.current = list._items[this.index]; this.index++; return true; } return this.MoveNextRare(); } private bool MoveNextRare() { if (this.version != this.list._version) {

2021-06-02 23:28:09    分类:技术分享    c#   .net   concurrency   ienumerable   enumeration

为什么asInstanceOf不抛出ClassCastException?(Why asInstanceOf doesn't throw a ClassCastException?)
问题 为什么asInstanceOf不抛出ClassCastException? scala> List("a").asInstanceOf[List[Int]] res34: List[Int] = List(a) 回答1 从scaladoc: 请注意,在运行时进行转换的成功是Scala擦除语义的模数。 因此,表达式1.asInstanceOf [String]在运行时将引发ClassCastException,而表达式List(1).asInstanceOf [List [String]]则不会。 在后一个示例中,由于将type参数作为编译的一部分进行了擦除,因此无法检查列表的内容是否为请求的类型。 如果尝试访问变量或映射转换,则其正确性将引发异常: scala> List("a").asInstanceOf[List[Int]] res0: List[Int] = List(a) scala> res0 res1: List[Int] = List(a) scala> res0(0) java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer List("a").map(_.asInstanceOf[Int]) java.lang.ClassCastException

2021-05-06 23:12:37    分类:技术分享    scala   type-safety

为什么 std::shared_ptr 解引用不抛出空指针异常(或类似异常)?(Why doesn't std::shared_ptr dereference throw a null pointer exception (or similar)?)
问题 异常是 C++ 的重要组成部分,使用它的原因之一(我知道有很多更重要的其他原因)是为了避免使用大量if语句混淆代码的不必要检查(也许这是一个不正确的假设? )。 所以现在我很好奇为什么std::shared_ptr::operator*和std::shared_ptr::operator->不抛出null_ptr_exception或类似的? 回答1 我的理解是智能指针类被设计成看起来和行为像原始指针。 鉴于此指导性设计原则,理想情况下,遗留代码可以使用等效的所有权语义简单地将原始指针的使用替换为智能指针,并且代码将完全像以前一样工作。 因此,更改取消引用智能指针的行为不应进行任何额外的检查或抛出异常(即,因为原始指针不会以这种方式运行)。 向标准添加智能指针的提议表明了这一设计决策(将通用智能指针添加到库技术报告的提议): 三、 设计决策 A. 一般原则 “尽可能接近原始指针,但不能更接近” 回答2 如果每次取消引用共享指针都需要检查nullptr并有条件地抛出异常,则可能会有大量冗余检查、代码膨胀和开销。 当然 - 优化器可能会消除其中的一些,但仍然......相反,程序员希望在许多取消引用之前检查一次。

2021-09-30 01:02:11    分类:技术分享    c++   exception

为什么 Junit 测试不抛出 javax.persistence.PersistenceException?(Why doesn't Junit test throw javax.persistence.PersistenceException?)
问题 我运行 JUnit4 测试来测试我的 JPA 存储库。 但是当我尝试运行这个必须抛出javax.persistence.PersistenceException测试时,我的测试失败了 - 它没有得到所需的异常。 我已经在 H2、HSQL、Derby 和 MySQL 上试过了。 这里是: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:testContext.xml" }) @Transactional @FixMethodOrder(MethodSorters.JVM) public class RepositoryTestTemplate extends AbstractTransactionalJUnit4SpringContextTests { } public class AccountRepositoryTest extends RepositoryTestTemplate { @Autowired AccountRepository accountRepository; @Test(expected = PersistenceException.class) public void doubleSaveMethodCallTest() {

2021-09-29 09:04:32    分类:技术分享    java   hibernate   exception   jpa   junit4

为什么这段代码不抛出NullPointerException(why doesn't this code throw NullPointerException)
问题 我只是在和朋友讨论使用类名调用静态方法的问题,并尝试了这段代码并期望它在运行时抛出NPE。 我只想了解执行顺序。 public class One { public static void method() { System.out.println("in static one"); } } public class Two { static One o; public static void main(String[] args) { o.method(); // expected NPE here, as o is null } } 我知道应该使用它们的类名来调用静态方法,我什至知道当我们使用instance调用静态方法时,IDE会发出编译器警告。 但是我们也可以通过创建实例来调用它们,但是,我从未在此处创建实例, o应该将其默认值设置为null,因此调用o.method()应该在运行时抛出NPE,但事实并非如此。 你们能告诉我们这段代码的执行顺序如何吗? 回答1 之所以起作用,是因为重要的是o字段的编译时类型。 编译器将编译o.method()成相同的字节代码作为One.method() 特别是,如果您有一个扩展了One的类Two ,并且都声明了一个static void method() ,那么 One x = new Two(); x.method(); //

2021-05-17 22:26:43    分类:技术分享    java   static   classloader   static-methods

为什么我的 WCF 端点不抛出 Max Clock Skew 异常?(Why doesn't my WCF endpoint throw a Max Clock Skew exception?)
问题 对于我的应用程序中几乎所有(安全)WCF 服务端点,如果客户端的系统时钟在未来或过去设置得太远,我会从 WCF 时钟偏移机制中得到一个异常(此处描述:http://www.danrigsby .com/blog/index.php/2008/08/26/changed-the-default-clock-skew-in-wcf/)。 然而,实现我的 Login() 方法的一个端点永远不会抛出这个异常,即使它启用了传输安全(自然不需要凭据)。 为什么“时钟偏移机制”不适用于此端点? 也许是因为 clientCredentialType 设置为“无”? 例如,这是我的配置的简化版本: <services> <service name="Foo"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="binding1" contract="IFoo" /> </service> </services> <bindings> <wsHttpBinding> <binding name="binding1" maxReceivedMessageSize="100000000"> <readerQuotas maxDepth="1000000000" maxArrayLength="1000000000"

2021-09-30 00:23:45    分类:技术分享    wcf   wcf-security

为什么我们不抛出这些异常?(Why are we not to throw these exceptions?)
问题 我碰到了这个MSDN页面,其中指出: 不要故意从您自己的源代码中引发Exception,SystemException,NullReferenceException或IndexOutOfRangeException。 不幸的是,它不会费心解释原因。 我可以猜测出原因,但我希望对此问题更有权威的人可以提供自己的见解。 前两个很明显,但是后两个看起来就像您想雇用的(事实上,我有)。 此外,这些是唯一应避免的例外吗? 如果还有其他人,它们是什么?为什么也要避免它们? 回答1 异常是所有异常的基本类型,因此非常不确定。 您永远不要抛出此异常,因为它根本不包含任何有用的信息。 调用代码捕获异常不会使故意抛出的异常(从您的逻辑)与其他完全不希望的系统异常,并指出真正的错误。 同样的原因也适用于SystemException。 如果查看派生类型的列表,则可以看到大量其他语义非常不同的其他异常。 NullReferenceException和IndexOutOfRangeException是另一种。 现在,这些都是非常具体的例外,因此抛出它们可能很好。 但是,您仍然不希望抛出这些错误,因为它们通常意味着您的逻辑中存在一些实际错误。 例如,null引用异常意味着您正在尝试访问null的对象的成员。 如果这在您的代码中是可能的,那么您应该始终显式检查null并引发更有用的异常

2021-05-25 00:57:19    分类:技术分享    c#   exception-handling

除以0.0时,为什么Java不抛出异常?(Why doesn't Java throw an Exception when dividing by 0.0?)
问题 我有代码来计算2个数字之间的百分比差- (oldNum - newNum) / oldNum * 100; -两个数字均为double 。 我希望在oldNum为0的情况下必须添加某种检查/异常处理。但是,当我对oldNum和newNum的值均为0.0进行测试运行时,执行继续,就好像什么都没有发生并且没有引发任何错误一样。 如果将这些代码与int一起运行,肯定会导致算术除数为零的异常。 对于double为什么Java会忽略它? 回答1 从数学上讲,零除的结果是undefined ,可以用浮点数/双精度数表示(因为NaN不是数字),但是从根本上讲这不是错误的。 由于整数必须具有特定的数值,因此在处理它们时必须在除以零时引发错误。 回答2 Java的float和double类型,与几乎所有其他语言(以及几乎任何硬件FP单元)一样,实现了针对浮点数学运算的IEEE 754标准,该标准要求除以零以返回特殊的“无穷大”值。 引发异常实际上会违反该标准。 整数算法(由Java以及大多数其他语言和硬件以二进制补码表示)是不同的,并且没有特殊的无穷或NaN值,因此抛出异常是一种有用的行为。 回答3 双精度数的存储方式与int完全不同。 有关Java如何处理双重计算的详细说明,请参见http://firstclassthoughts.co.uk/java/traps/java_double

2021-03-29 01:17:46    分类:技术分享    java   types   integer   double   divide-by-zero

如果在声明变量之前使用了变量,为什么不抛出ReferenceError?(Why is no ReferenceError being thrown if a variable is used before it’s declared?)
问题 我试图将注意力投向JavaScript中引发的参考错误的行为。 在以下示例中,第二行引发ReferenceError ,执行中断: var obj = {}; obj.func1 = func2; alert('Completed'); 在此示例中,尽管obj.func1仍未undefined ,但代码已成功完成: var obj = {}; obj.func1 = func2; var func2 = function() { alert('func2'); }; alert('Completed'); 我的假设是在第二行将抛出相同的错误,如果不是这种情况,我希望obj.func1正确引用func2 ,但是我一直是双盲的。 那么,这到底是怎么回事? 回答1 var吊起; 该变量存在于当前范围内。 因此,第二个示例等效于: var obj; var func2; obj = {}; obj.func1 = func2; func2 = function() { alert('func2'); } alert('Completed'); 因此,执行分配时,名称func2是已知的,但undefined 。 在第一个示例中,它是未知的,从而引发ReferenceError 。 回答2 这是由于Javascript变量声明“吊装”引起的。 用var声明的变量在函数中随处可见

2021-05-09 01:46:20    分类:技术分享    javascript   variable-declaration   referenceerror   hoisting

为什么当我测试某个方法引发异常而该方法引发异常时,测试是否停止?(Why, when I am testing that a method throws an exception and the method throw an exception, does the test stop?)
问题 我有一个单元测试,测试如果method时抛出异常condition存在,并且method不抛出异常如预期。 - (void)testMethodThrowsWhenConditionIsPresent { XCTAssertThrows([Foo methodWithCondition: condition], @"Condition is true, method should throw exception"); } 这是异常源: - (void)methodWithCondition:(someType)condition { if (condition) { [NSException raise: @"condition is true!" format: @"condition is true!"]; } } 为什么测试在引发异常的行处停止? 测试没有继续,它在那行停止,当我希望它继续并从XCTAssertThrows()返回1 ,使测试成功。 相反,测试通过Xcode停止,使我进入抛出的行,并带有绿色的“线程1:断点1.1”,调试器出现在控制台中。 回答1 引发执行后,为什么测试会停止? 因为您有一个断点,所以它会停止执行。 为什么在删除断点后引发异常时我的应用程序崩溃? 因为您有未处理的异常。 未处理的异常会导致程序崩溃。 如何处理异常,以免程序崩溃?

2021-05-25 00:35:42    分类:技术分享    objective-c   unit-testing   exception   throw   xctest

为什么“continue”语句不能放在“finally”块中?(Why can't a 'continue' statement be inside a 'finally' block?)
问题 我没有问题; 我只是好奇。 想象以下场景: foreach (var foo in list) { try { //Some code } catch (Exception) { //Some more code } finally { continue; } } 这不会编译,因为它会引发编译器错误 CS0157: 控制不能离开 finally 子句的主体 为什么? 回答1 无论是否抛出异常, finally块都会运行。 如果抛出异常,那他妈的会continue做什么? 您不能继续执行循环,因为未捕获的异常会将控制转移到另一个函数。 即使没有抛出异常, finally也会在 try/catch 块内的其他控制转移语句运行时运行,例如return ,这带来了同样的问题。 简而言之,对于finally的语义,允许将控制从finally块内部转移到它的外部是没有意义的。 用一些替代语义支持这一点会更令人困惑而不是有帮助,因为有一些简单的解决方法可以使预期的行为方式更清晰。 所以你得到一个错误,并被迫正确思考你的问题。 这是 C# 中普遍存在的“把你扔进成功的坑”的想法。 如果您想忽略异常(通常是一个坏主意)并继续执行循环,请使用 catch all 块: foreach ( var in list ) { try{ //some code }catch{ continue; } }

2021-06-10 13:55:30    分类:技术分享    c#   .net

当两个值都是双倍时,为什么没有 ArithmeticException(除以零)? [复制](why there is no ArithmeticException( divide by zero) when both values are double? [duplicate])
问题 这个问题在这里已经有了答案: 为什么在除以 0.0 时 Java 不抛出异常? (5 个回答) 7年前关闭。 看过Double.java的源代码和一些常量就像 /** * Constant for the Not-a-Number (NaN) value of the {@code double} type. */ public static final double NaN = 0.0 / 0.0; /** * Constant for the positive infinity value of the {@code double} type. */ public static final double POSITIVE_INFINITY = 1.0 / 0.0; /** * Constant for the negative infinity value of the {@code double} type. */ public static final double NEGATIVE_INFINITY = -1.0 / 0.0; 但我想知道为什么它不抛出 ArithmeticException(除以零)? 我试过了 public static final int VALUE = 0/0; 现在它抛出异常但是当我说 public static final double

2021-09-13 05:11:15    分类:技术分享    java   android   exception   math

为什么Java编译器允许在throws部分中列出该方法无法抛出的异常(Why does the Java compiler allow exceptions to be listed in the throws section that it is impossible for the method to throw)
问题 如果有一些代码显然不能引发异常,则Java编译器似乎不一致,而您编写的周围代码声明该代码可以引发该异常。 考虑这些代码片段。 片段1 catch从未抛出的异常。 public void g(){ try { } catch (FileNotFoundException e) {//any checked exception } } 是带信息的编译错误 Unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body 片段2 throws声明,指示从未抛出的异常。 public void g() throws FileNotFoundException{ } 它编译良好。 因此,第一个代码段的结果表明,编译器可以计算方法是否可以抛出throws列表中列出的throws 。 因此,似乎编译器故意不报告第二个片段的错误。 但为什么? 即使编译器知道无法抛出这些异常,为什么编译器仍允许您在throws部分中编写异常? 回答1 编译器允许这样做,因为方法的throws子句是方法签名的一部分,而不是其实现的一部分。 在使签名保持不变的同时,实现可能会在某些时候发生变化。 旧的实现可能引发了检查异常,而新的实现则没有。 否则

2021-04-30 18:27:06    分类:技术分享    java   exception   exception-handling

List 抛出 ConcurrentModificationException 但 set 不抛出 ConcurrentModificationException? [复制](List throws ConcurrentModificationException but set does not throws ConcurrentModificationException? [duplicate])
问题 这个问题在这里已经有了答案: 为什么抛出 ConcurrentModificationException 以及如何调试它8 个回答 2年前关闭。 我有以下两个java类 import java.util.*; public class ArrayListTest032 { public static void main(String[] ar) { List<String> list = new ArrayList<String>(); list.add("core java"); list.add("php"); list.add("j2ee"); list.add("struts"); list.add("hibernate"); Iterator<String> itr = list.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } list.remove("php"); while (itr.hasNext()) { System.out.println(itr.next()); } } } 当我运行上面的代码时,我得到下面的输出。 core java php j2ee struts hibernate Exception in thread "main" java.util

2021-06-09 19:26:57    分类:技术分享    java   list   arraylist   set   hashset

为什么 XmlSerializer 会抛出 InvalidOperationException?(Why is XmlSerializer throwing an InvalidOperationException?)
问题 public void Save() { XmlSerializer Serializer = new XmlSerializer(typeof(DatabaseInformation)); /* A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll A first chance exception of type 'System.InvalidOperationException' occurred in System.Xml.dll */ // .... } 如果您需要,这是整个课程: public class DatabaseInformation { /* Create new database */ public DatabaseInformation(string name) { mName = name; NeedsSaving = true; mFieldsInfo = new List<DatabaseField>(); } /* Read from

2021-09-01 07:05:46    分类:技术分享    c#   .net   exception   invalidoperationexception

对象上的方法调用不会引发异常(Method call on object does NOT throw exception)
问题 这些天我遇到了许多奇怪的情况:-) 我在 ASP.Net 应用程序中测试了以下两个代码。 当字符串值为空时,代码 1 抛出异常(如预期),而代码 2 不抛出异常(与预期相反)。 为什么“ EVAL ”在这种情况下不抛出异常? EVAL 会一直这样工作(即“无一例外”)还是只是运气? 是否有任何 MSDN 参考说“Eval”返回空字符串? //代码 1 :导致异常 string test = Convert.ToString(subscriber.EncryptedSSN).Substring(0, Convert.ToString(subscriber.EncryptedSSN).Length >= 5 ? 5 : Convert.ToString(subscriber.EncryptedSSN).Length); //代码 2 : 不抛出异常 <%# Convert.ToString(Eval("EncryptedSSN")).Substring(0, Convert.ToString(Eval("EncryptedSSN")).Length >= 5 ? 5 : Convert.ToString(Eval("EncryptedSSN")).Length) %> 参考资料: DBNull 的评估检查不起作用 Convert.ToString 对于“NULL 对象”和

2021-09-25 01:27:51    分类:技术分享    c#   asp.net   .net

为什么在编译时不强制执行 noexcept ?(Why noexcept is not enforced at compile time?)
问题 您可能知道 C++11 有 noexcept 关键字。 现在丑陋的部分是这样的: 请注意,函数上的 noexcept 规范不是编译时检查; 它只是程序员通知编译器一个函数是否应该抛出异常的一种方法。 http://en.cppreference.com/w/cpp/language/noexcept_spec 那么这是委员会的设计失败还是他们只是把它作为编译作者的练习:) 从某种意义上说,体面的编译器会强制执行它,坏的编译器仍然可以合规? 顺便说一句,如果你问为什么没有第三个选项(也就是不能完成),原因是我可以很容易地想到一种(慢)方法来检查函数是否可以抛出。 如果您将输入限制为 5 和 7(也就是我保证文件不会包含 5 和 7 之外的任何内容),那么问题当然是不存在的,并且只有在您给它 33 时才会抛出,但恕我直言,这不是一个现实问题。 回答1 委员会非常清楚地考虑了(试图)抛出异常规范所不允许的异常的可能性被认为是格式错误的,并拒绝了这个想法。 根据 15.4/11 美元: 实现不应仅仅因为表达式在执行时抛出或可能抛出包含函数不允许的异常而拒绝表达式。 [ 例子: extern void f() throw(X, Y); void g() throw(X) { f(); // OK } 对f的调用是格式良好的,即使在调用时f可能会抛出g不允许的异常Y —结束示例]

2021-07-11 05:00:00    分类:技术分享    c++   c++11

尽管声明为 noexcept(false),但为什么 std::vector 使用移动构造函数(Why does std::vector use the move constructor although declared as noexcept(false))
问题 无论我在互联网上的何处阅读,强烈建议如果我希望我的类与std::vector一起工作(即std::vector使用我类中的移动语义),我应该将移动构造函数声明为“noexcept” (或noexcept(true) )。 为什么std::vector使用它,即使我将它标记为noexcept(false)作为实验? #include <iostream> #include <vector> using std::cout; struct T { T() { cout <<"T()\n"; } T(const T&) { cout <<"T(const T&)\n"; } T& operator= (const T&) { cout <<"T& operator= (const T&)\n"; return *this; } ~T() { cout << "~T()\n"; } T& operator=(T&&) noexcept(false) { cout <<"T& operator=(T&&)\n"; return *this; } T(T&&) noexcept(false) { cout << "T(T&&)\n"; } }; int main() { std::vector<T> t_vec; t_vec.push_back(T()); } 输出: T() T(T&&

2021-09-14 13:37:33    分类:技术分享    c++   c++11   vector   move-semantics   noexcept

生成通用“服务不可用”消息的 ELMAH 异常(ELMAH exceptions generating generic “The service is unavailable” message)
问题 我正在尝试创建一个可用性页面,该页面检查站点使用的所有服务,将每个检查包装在 try/catch 中,然后向用户显示任何失败。 这些服务之一是 ELMAH,所以我调用它是为了仔细检查我们是否可以在那里成功记录错误。 控制器: var a = new AvailabilityModel(); try { a.ElmahConnectionString = ConfigurationManager.ConnectionStrings["elmah-sqlserver"].ConnectionString; Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Elmah availability test")); a.ElmahSuccess = true; } catch (Exception ex) { a.ElmahSuccess = false; a.ElmahException = ex; Response.StatusCode = 503; } return View(a); 当 ELMAH 成功时,一切都会好起来。 当它抛出任何类型的错误(数据库权限等)时,我得到一个错误,它没有被 try/catch 或任何正常的错误捕获部分捕获:ASP.NET MVC HandleError 、

2021-06-12 08:53:56    分类:技术分享    c#   asp.net   asp.net-mvc   elmah   elmah.mvc

为什么这个承诺默默地失败了?(Why does this promise silently fail?)
问题 db.collection.findOne是一个异步操作(MongoDB,但这在这里并不重要),这就是我在这里将它包装在一个 promise 中的原因。 var letsDoSomething = new Promise(function(resolve, reject){ db.collection('stackoverflow').findOne({question: true}, function(err, question){ resolve(question); // let's pretend we found a question here, and it is now resolving }) }) letsDoSomething.then(function(myData){ // it resolves console.log('foo', bar); // since 'bar' is undefined, this should fail – why doesn't it? No error messages, it goes completely silent }); 当我尝试记录bar ,为什么调试器不抛出错误,而bar根本不存在? 它只是一声噤声,一言不发。 预期结果(在我看来): console.log('foo', bar)

2021-06-22 11:44:32    分类:技术分享    javascript   node.js   promise

在WPF中,Visual.PointFromScreen在什么情况下会抛出InvalidOperationException?(In WPF, under what circumstances does Visual.PointFromScreen throw InvalidOperationException?)
问题 假设我想这样做,所以我可以找到鼠标相对于Visual的当前位置,而无需访问特定的鼠标事件: public static Point GetMousePosition(this Visual relativeTo) { return relativeTo.PointFromScreen(GetMousePositionOnScreen()); } 有时(通常是当我刚刚在两个选项卡控件之间切换时) PointFromScreen会抛出一个InvalidOperationException并显示消息This Visual is not connected to a PresentationSource。 在查看Visual可用的属性时,我看不到任何与PresentationSource 。 给定一个Visual ,当我调用PointFromScreen时,如何判断它是否会抛出该异常? 回答1 有一个静态方法 PresentationSource.FromVisual 其中: 返回显示提供的 Visual 的源。 我知道这并不能解决根本问题,但是您可以在调用PointFromScreen之前检查 Visual 是否已连接到 PresentationSource 。 它可以防止出现异常,但是您首先需要对它为什么没有连接进行更多调查。 回答2 我在定制视觉效果方面遇到了类似的问题。

2021-06-11 12:11:00    分类:技术分享    wpf   .net-3.5

不抛出异常时的性能 (C++)(Performance when exceptions are not thrown (C++))
问题 我已经阅读了很多关于 C++ 异常和我所看到的内容,特别是异常性能是一个很难的话题。 我什至试图在 g++ 的引擎盖下查看异常是如何在程序集中表示的。 我是一名 C 程序员,因为我更喜欢低级语言。 前段时间我决定使用 C++ 而不是 C,因为它可以以较低的成本让我的生活变得更轻松(结构、模板等上的类)。 回到我的问题,因为我看到异常只有在发生时才会产生开销,因为它需要一长串跳转和比较指令才能找到合适的异常处理程序。 在正常的程序执行中(没有错误),异常开销等于正常的返回码检查。 我对吗? 回答1 请在此处查看我对类似问题的详细回复。 异常处理开销是特定于平台的,取决于您运行的操作系统、编译器和 CPU 架构。 对于 Visual Studio、Windows 和 x86,即使不引发异常也会产生成本。 编译器会生成额外的代码来跟踪当前的“范围”,这些代码稍后用于确定要调用的析构函数以及从哪里开始搜索异常过滤器和处理程序。 范围更改由try块和使用析构函数创建对象触发。 对于 Visual Studio、Windows 和 x86-64,当不抛出异常时,成本基本上为零。 x86-64 ABI 在异常处理方面的协议比 x86 严格得多,而且操作系统做了很多繁重的工作,因此程序本身不需要跟踪尽可能多的信息来处理异常。 当异常发生时,代价是巨大的

2021-06-24 08:56:33    分类:技术分享    c++   exception

为什么提出例外有副作用?(Why is the raising of an exception a side effect?)
问题 根据维基百科关于副作用的条目,提出例外就构成了副作用。 考虑一下这个简单的python函数: def foo(arg): if not arg: raise ValueError('arg cannot be None') else: return 10 使用foo(None)调用它总是会遇到异常。 相同的输入,相同的输出。 它是参照透明的。 为什么这不是纯函数? 回答1 仅当您观察到异常并根据其做出更改控制流程的决定时,才会违反纯度。 实际上,抛出异常值在引用上是透明的-从语义上讲,它等效于非终止或其他所谓的最低值。 如果一个(纯)函数不是总计,那么它将求出一个底值。 如何对最低值进行编码取决于具体实现-这可能是一个例外; 或不终止,除以零或其他一些失败。 考虑纯函数: f :: Int -> Int f 0 = 1 f 1 = 2 并非为所有输入都定义。 对于某些人,它的评估结果是最低的。 该实现通过抛出异常来对此进行编码。 从语义上讲,它应等效于使用Maybe或Option类型。 现在,只有在观察最低值时才打破参照透明性,并以此为依据进行决策-这可能会引入不确定性,因为可能会抛出许多不同的异常,并且您不知道哪个异常。 因此,出于这个原因,捕获异常是在Haskell的IO monad中进行的,而生成所谓的“不精确”异常可以完全完成。 因此,引发例外并非如此,这是不正确的。

2021-04-20 00:55:10    分类:技术分享    functional-programming   side-effects

这个 PDO 准备好的语句返回 false 但不抛出错误(This PDO prepared statement returns false but does not throw an error)
问题 这段代码没有抛出错误但是查询失败,即execute方法返回false。 怎么会这样? require_once("Abstracts/DBManager.php"); require_once("UI/UI.Package.php"); class BlogDBM extends DBManager { private $table = "blog_records"; function saveRecord($title,$url,$desc,$feedId,$pubDate) { $PDO = $this->db->connect(); try { $query = $PDO->prepare(" INSERT INTO ".$this->table." (title,url,desc,feed_id,pubdate) VALUES (:title,:url,:desc,:feed_id,:pubdate)"); $query->bindParam(":title", $title); $query->bindParam(":url", $url); $query->bindParam(":desc", $desc); $query->bindParam(":feed_id", $feedId, PDO::PARAM_INT); $query->bindParam("

2021-09-01 10:07:57    分类:技术分享    php   mysql   insert   pdo   prepared-statement

为什么 Controls 集合不提供所有 IEnumerable 方法?(Why doesn't the Controls collection provide all of the IEnumerable methods?)
问题 我不确定 ASP.Net 的 ControlCollection 是如何工作的,所以也许有人可以为我解释一下。 我最近发现了扩展方法和 Linq 的神奇之处。 好吧,我很悲哀地发现这是无效的语法 var c=Controls.Where(x => x.ID=="Some ID").SingleOrDefault(); 但是,据我所知, Controls确实实现了提供此类方法的IEnumerable接口,那么有什么作用呢? 为什么这不起作用? 我至少找到了解决这个问题的体面的工作: var list = (IEnumerable<Control>)Controls; var this_item = list.Where(x => x.ID == "Some ID").SingleOrDefault(); 回答1 不, IEnumerable上没有很多扩展方法: IEnumerable<T>有。 它们是两个独立的接口,尽管IEnumerable<T>扩展了IEnumerable 。 正常的 LINQ 转换方式是使用 Cast<T>() 和 OfType<T>() 扩展方法,它们确实扩展了非泛型接口: IEnumerable<TextBox> textBoxes = Controls.OfType<TextBox>(); IEnumerable<Control> controls

2021-06-22 21:59:37    分类:技术分享    c#   asp.net   linq   extension-methods   ienumerable

有收益返回的方法不抛出异常(Method having yield return is not throwing exception)
问题 我在visual studio中有这段代码,当参数为空时不会抛出异常,我不知道为什么! 收益率是否以某种方式弄乱了它? IEnumerable<string> Method(string s) { if(string == null) { throw new Exception(); } if(dictionary.TryGetValue(s, out list)) { foreach(string k in list) { yield return k; } } } 回答1 您有迭代器,在您开始枚举(即使用)它之前不会执行它。 要获得异常,您可以在foreach语句中调用此方法,或使用一些立即执行的 LINQ 运算符(ToList、ToArray、First 等): foreach(var s in Method(null)) // or Method(null).ToList(); 进一步阅读收益(C# 参考) 如果要立即验证参数,则应将此方法拆分为两种方法: public IEnumerable<string> Method(string s) { if(s == null) throw new ArgumentNullException(nameof(s)); return MethodIterator(s); } private IEnumerable<string

2021-06-28 10:22:10    分类:技术分享    c#

COM 互操作对象在一个项目中抛出 InvalidCastException 而在其他项目中不抛出(COM interop object throws InvalidCastException in one project but not in other)
问题 我在测试 C# 解决方案中导入了一个 COM 对象。 一切正常,并继续这样做。 然后我在我的实际解决方案中导入了相同的 COM 对象,并作为测试实现了与测试项目中完全相同的行。 当我运行真正的项目时,我得到一个 InvalidCastException 无法将类型为“CTWebReport.WebReportCOMClass”的 COM 对象转换为接口类型“CTWebReport.IWebReportCOM”。 此操作失败,因为 IID 为“{5DFA18E8-4E71-4ADC-A812-6B166C242561}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) . 我在整个系统中搜索了对互操作和 com 库的每个引用,这包括我能找到的所有 bin 和 obj 文件夹。 除了原始的 COM 库,我都删除了它们,并清理了我的回收站。 没有区别,完全一样的情况。 测试项目有效,实际项目无效。 编辑似乎 COM 在 winforms 应用程序中工作,但不在我的类库中(由 asp.net mvc web 应用程序使用)。 我不知道接下来要做什么。 有什么建议吗? 回答1 不同之处在于线程。 winform 线程从主线程执行代码,而 asp.net

2021-06-02 22:23:13    分类:技术分享    c#   .net   com   interop

@Valid 不抛出异常(@Valid not throwing exception)
问题 我正在尝试使用 @Valid 验证我的 JPA 实体,如下所示: public static void persist(@Valid Object o) 它工作了一段时间,但现在它停止工作,我不知道为什么。 我尝试在persist方法中手动执行此操作,并且按预期工作: ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<Object>> constraintViolations = validator.validate(o); if (!constraintViolations.isEmpty()) { throw new ConstraintViolationException(constraintViolations); } 可能会发生什么或者我该如何调试? 回答1 不适用于任意服务。 在 Jersey 中,它仅适用于资源方法。 因此,请在您的资源方法中验证传入的 DTO。 @POST public Response post(@Valid SomeDTO dto) {} 在 Bean 验证支持中查看更多信息 更新 因此,为了回答 OP

2021-09-29 05:08:53    分类:技术分享    java   hibernate   jersey   bean-validation   jersey-2.0

为什么 STL 容器中的交换成员函数没有声明为 noexcept?(Why are the swap member functions in STL containers not declared noexcept?)
问题 从 N3797 开始,C++ 标准要求容器的swap函数不抛出任何异常,除非另有说明[container.requirements.general] ( 23.2.1§10 )。 为什么指定为不抛出的swap成员函数未声明为noexcept ? 同样的问题适用于专门的非成员swap重载。 回答1 除了 refp 所说的之外,以下是 Daniel Krügler 在std-discussion邮件列表上的帖子: 将函数声明为无条件 noexcept 的内部策略在 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3279.pdf 使用该论文中使用的术语,std::vector 的交换函数有一个收缩契约,即它有关于参与对象的分配器的先决条件。 这意味着,存在调用者可能违反先决条件的可能性,并且应该允许实现以不同于终止的方式发出信号。 因此这样的函数不应该是noexcept,而是应该有一个有效的元素“抛出:无”,因为这适用于满足前提条件的情况。 (关联) 所说的内部政策是对您问题的规范、官方答案。 回答2 这可能听起来奇怪在第一,但没有明确指出swap标准集装箱被noexcept是故意的; 这一切都归结为未定义的行为(UB)。 23.2.1p9一般容器要求[container.requirements.general]

2021-08-31 02:14:28    分类:技术分享    c++   c++11   swap   noexcept

为什么从多个线程进行修改后,ArrayList不会引发ConcurrentModificationException?(Why does ArrayList not throw ConcurrentModificationException when modified from multiple threads?)
问题 ConcurrentModificationException:当不允许对对象进行并发修改时,检测到该对象的并发修改的方法可能会抛出此异常。 上面是javadoc中的ConcurrentModificationException定义。 所以我尝试测试以下代码: final List<String> tickets = new ArrayList<String>(100000); for (int i = 0; i < 100000; i++) { tickets.add("ticket NO," + i); } for (int i = 0; i < 10; i++) { Thread salethread = new Thread() { public void run() { while (tickets.size() > 0) { tickets.remove(0); System.out.println(Thread.currentThread().getId()+"Remove 0"); } } }; salethread.start(); } 代码很简单。 10个线程从arraylist对象中删除该元素。 确保多个线程访问一个对象。 但它运行正常。 没有异常被抛出。 为什么? 回答1 为了您的利益,我引用了ArrayList Javadoc的很大一部分。

2021-05-18 04:52:43    分类:技术分享    java   multithreading   arraylist   thread-safety

使用 NUnit 在 VS2012 中调试而不抛出异常?(Debugging in VS2012 with NUnit without throwing exceptions?)
问题 我使用 NUnit 测试适配器将 NUnit 运行到 VS2012 中,我可以正常运行所有测试,但是如果我想在每次点击断言时调试所有测试,它会引发异常。 如何使它不为断言抛出异常? 我做错了什么吗? 回答1 当调试器被连接时,失败的断言会抛出异常。 这是预期的行为。 没有必要惊慌。 您可以通过进入 Debug -> Exceptions... 并从“Break when an exception is:”框中的“Thrown”列中取消选中相应组中的所有或某些项目来阻止 Visual Studio 在某些异常处停止。

2021-07-11 05:45:41    分类:技术分享    c#   debugging   nunit

OData 扩展 null(OData expanding null)
问题 使用 OData 时,如果正在扩展的属性之一为空,我会收到此错误。 有没有办法解决这个问题? 我期望的输出是扩展属性为 null 不抛出任何异常。 <m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> <m:code/> <m:message xml:lang="en-US">An error has occurred.</m:message> <m:innererror> <m:message> The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'. </m:message> <m:type>System.InvalidOperationException</m:type> <m:stacktrace/> <m:internalexception> <m:message> The EDM instance of type '[Spawtz.OData.Models.Division Nullable=True]' is missing the property 'Id'. </m

2021-08-30 21:10:11    分类:技术分享    c#   odata

抛出还是不抛出异常?(To throw or not to throw exceptions?)
问题 我在和我的一个朋友聊天,因为我不知道如何用C ++来处理异常,因此通过新代码我没有处理异常。 他的回答使我感到惊讶:“为什么要在地狱里丢东西呢?”。 我问他为什么,但是他没有一个令人满意的答案,所以我用谷歌搜索。 我发现的第一页内容是一个博客条目,发布该帖子的人并不完全反对例外,但是在答复中引发了一场宗教战争:http://weblogs.asp.net/alex_papadimoulis/archive/2005/03 /29/396141.aspx 现在我开始怀疑:抛出异常是否很糟糕? 对于像我这样的学生来说,使用异常作为常识来学习编程是错误的吗? (大多数时候,当我抛出异常时,我会将它们捕获在另一级代码中以对其进行处理)。 我有一个代码示例,我想知道应该怎么做: int x; cout << "Type an integer: "; cin >> x; 在那里输入的任何不是整数的东西都会触发异常,对吗? 该异常应在此处处理。 但是,当我在程序中其他地方使用的类中有可能的异常时,我应该使此方法引发异常,以便可以在调用它的任何地方对其进行处理,或者在有任何问题时使它返回标准值? 例外总是好,总是坏,还是在“例外”情况下要使用的例外? 为什么? 回答1 默认情况下,C ++ iostreams类不使用异常处理。 通常,对于可能发生错误的情况,应该使用例外,但此类错误是

2021-05-08 23:08:12    分类:技术分享    c++

为什么代码分析在这里告诉我“不要多次处置对象”:(Why does Code Analysis tell me, “Do not dispose objects multiple times” here:)
问题 在此代码上: public static string Base64FromFileName(string fileName) { try { FileInfo fInfo = new FileInfo(fileName); long numBytes = fInfo.Length; FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fStream); byte[] bdata = br.ReadBytes((int)numBytes); br.Close(); fStream.Close(); return Convert.ToBase64String(bdata); } catch(Exception e) { throw e; } } ...我得到了,由 Visual Studio 的代码分析工具提供的警告,“不要多次处置对象......为了避免生成 System.ObjectDisposedException,你不应该在一个对象上多次调用 Dispose ”。 fStream.Close();" 线。 为什么? fStream 是否设置在上面的行中,其中 BinaryReader 关闭?

2021-06-12 05:02:51    分类:技术分享    c#   visual-studio-2013   filestream   dispose   binaryreader

Java Runtime exec 不抛出此类文件或权限被拒绝(Java Runtime exec throws no such file or permission denied)
问题 我的程序在 ubuntu 10.04 上运行,代码如下: Process process=Runtime.getRuntime().exec("ls",null,null); 它抛出一个异常: Cannot run program "ls": java.io.IOException: error=2, No such file or directory, 我试图将“ls”更改为“chmod”,“pwd”,我发现没有一个shell命令有效,都遇到了同样的问题。(我也试过“/bin/sh -c ls”) 然后我将代码更改为: Process process=Runtime.getRuntime().exec("/bin/ls",null,null); 它抛出一个异常: Cannot run program "/bin/ls": java.io.IOException: error=13, Permission denied 我已将所有相关文件和目录的权限更改为 777,所以我真的不知道它有什么问题。 谢谢您的回复 。 回答1 Process process=Runtime.getRuntime().exec("ls",null,null); 由于ls很可能不在程序的当前工作目录中,因此预计会出现No such file or directory异常。 当您从 Linux

2021-07-28 14:47:59    分类:技术分享    java   ubuntu   runtime.exec

啊! 为什么 System.Web.Mvc.HandleErrorInfo 会传递给我的视图?(Argh! Why does System.Web.Mvc.HandleErrorInfo get passed to my views?)
问题 我遇到了一个相当令人沮丧的问题。 我的 MVC 站点在大多数情况下运行良好,但随机抛出错误(向用户显示友好错误)。 当我检查日志时,这就是我得到的: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Web.Mvc.HandleErrorInfo' but this dictionary requires a model item of type 'BaseViewData'. 片刻之后,同一用户可以点击刷新并且页面加载正常。 我被困住了。 ;( 更新:添加了堆栈跟踪 System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Web.Mvc.HandleErrorInfo' but this dictionary requires a model item of type 'BaseViewData'

2021-06-11 04:58:58    分类:技术分享    c#   asp.net-mvc   controller   views   viewdata

为什么 XCode 会抛出重复的符号错误?(Why is XCode flaky about throwing duplicate symbol errors?)
问题 我有一个带有两个目标的 XCode 6 项目 - 一个 iOS 8 应用程序和一个 iOS 8 扩展。 我在两个目标之间共享一个常量文件。 我犯了一个错误,即在标头中声明了一个没有 extern 或静态前缀的 const int,这导致了重复的符号链接器错误。 这个错误的声明在项目的过去几次修订中都存在,并且从第一天起,常量头就包含在多个文件中。 那么,为什么我最近才开始收到错误消息——在我通过删除 Main.storyboard 对项目文件进行了更改之后——而且这也仅限于模拟器构建? 注意:这以前发生过 错误开始发生时的进一步背景: 我从项目文件中删除了一个未使用的 Main.storyboard,然后立即开始收到此链接器错误。 我知道这个错误现在不应该发生,因为相关的常数已经使用了很长时间。 无论如何,我修复了错误(通过将 const 声明为 extern 来代替),但现在开始出现一些其他错误。 我现在确信代码没有任何问题,只是 XCode 搞砸了。 所以为了测试,我再次删除了 Main.storyboard,奇怪的错误(抱歉我没有记录)又回来了,代码更改为零。 为了进一步确认,我在同一台机器上检查了一个完整的先前提交(它运行完美,并且仍然有 Main.storyboard)。 这一次,没有对代码、项目或 Main.storyboard 进行任何更改,我看到了同样的错误。

2021-09-14 01:20:04    分类:技术分享    ios   xcode   xcode6

Java ReentrantLock.unlock/await()/signal() 不抛出 IllegalMonitorStateException(Java ReentrantLock.unlock/await()/signal() not throwing IllegalMonitorStateException)
问题 我哪里错了? 即使我的消费者线程没有持有锁,程序也不会为任何锁调用(解锁/等待/信号)抛出 IllegalMonitorStateException。 更新: private final ReentrantLock lock = new ReentrantLock(); private final Condition producers = lock.newCondition(); private final Condition consumers = lock.newCondition(); @Override public void run() { while (true) { try { //lock.lockInterruptibly(); try { while (sharedResource.isEmpty()) { printErr(name + " : Queue Empty .."); consumers.await(500, TimeUnit.MILLISECONDS); } String obj = sharedResource.remove(0); printOut(name + " : " + obj); if (obj.equals(POISON_PILL)) { sharedResource.add(POISON_PILL); // System

2021-08-31 08:06:44    分类:技术分享    java   multithreading   locking

不抛出的方法的 Swift 错误处理 [重复](Swift Error Handling For Methods That Do Not Throw [duplicate])
问题 这个问题在这里已经有了答案: 如何在 Swift 中捕获“索引超出范围”? (5 个回答) 3年前关闭。 如何处理未显式抛出的方法或代码的错误? 将其包装为 do / catch 块会导致编译器警告: "'catch' block is unreachable because no errors are thrown in 'do' block" 来自 C#/JAVA 背景,这至少可以说是一个奇怪的问题。 作为开发人员,我应该能够保护和包装 do/catch 块中的任何代码块。 仅仅因为一个方法没有明确标记为“throw”并不意味着不会发生错误。 回答1 面对无法抛出的方法抛出的异常。 发现这个异常是从 API 的objective-c 部分抛出的。 因此,您应该使用objective-c 以旧式方式捕获它。 首先创建objective-c 类,它在init 方法中包含几个块——用于try、catch 和finally。 #import <Foundation/Foundation.h> /** Simple class for catching Objective-c-style exceptions */ @interface ObjcTry : NSObject /** * Initializeer * * @param tryBlock * @param

2021-06-28 03:10:04    分类:技术分享    swift   error-handling   do-catch

为什么不等待Task.WhenAll引发AggregateException?(Why doesn't await on Task.WhenAll throw an AggregateException?)
问题 在此代码中: private async void button1_Click(object sender, EventArgs e) { try { await Task.WhenAll(DoLongThingAsyncEx1(), DoLongThingAsyncEx2()); } catch (Exception ex) { // Expect AggregateException, but got InvalidTimeZoneException } } Task DoLongThingAsyncEx1() { return Task.Run(() => { throw new InvalidTimeZoneException(); }); } Task DoLongThingAsyncEx2() { return Task.Run(() => { throw new InvalidOperation();}); } 我希望WhenAll创建并引发一个AggregateException ,因为它正在等待的至少一项任务引发了异常。 相反,我找回了其中一个任务引发的单个异常。 WhenAll是否不总是创建AggregateException吗? 回答1 我不完全记得该在哪里,但是我在某处读到了新的async / await关键字

2021-04-03 18:21:31    分类:技术分享    .net   exception   asynchronous   tap

对于抛出异常的 Java 方法是否有特定的命名约定?(Is there a particular naming convention for Java methods that throw exceptions?)
问题 我很想添加一个像“Ex”这样的后缀来区分抛出异常的方法(具有相似的签名)和那些不抛出异常的方法。 有这样的约定吗? 回答1 是的,您将它们命名为与未命名的方法相同的名称。 异常规范还不够吗? 编辑:如果你有类似的抛出/不抛出的方法,我推荐Parse / TryParse模式( Parse被操作取代)。 .NET Framework 经常使用它( Dictionary<T,K>.TryGetValue 、 Monitor.TryEnter 、 int.TryParse等)。 编辑:编码恐怖:TryParse 和异常税 回答2 不要那样做。 这就像问“是否有将两个字符串作为参数的方法的命名约定”。 Java 已检查异常,这意味着您无论如何都需要声明它们。 所以你可以很容易地看到是否会抛出异常,以及什么类型的异常。 如果不添加异常处理代码,您甚至无法编译调用该方法的代码。 更新:似乎您的意图是拥有检查某个条件是否为真的方法,但您不想只返回 false,而是在不满足条件时抛出异常,以便您也可以传达解释信息(在异常中)。 我认为前缀“assert”或“ensure”是有道理的: // instead of if (! isAuthenticated()) throw new NotAuthenticatedException("not sure why at this point

2021-07-10 04:01:43    分类:技术分享    java   coding-style   method-names

如何构建一个或者不抛出异常?(How to construct a <stdexcept> or <system_error> exception without throwing?)
问题 <stdexcept>定义的异常(例如std::logic_error 、 std::runtime_error及其子类,例如std::system_error )具有期望字符串参数的构造函数,例如: domain_error(const string& what_arg); domain_error(const char* what_arg); 有后置条件 strcmp(what(), what_arg.c_str()) == 0 strcmp(what(), what_arg) == 0 分别。 不要求传递给构造函数的这些参数在这些异常的生命周期内保持有效,因此确保后置条件成立的唯一方法是复制和存储这些动态字符串。 这需要内存,所以我假设它们的构造本身可能会抛出std::bad_alloc或类似的东西,这通常是最意想不到的。 这会导致问题,因为我在野外看到的每个代码示例都鼓励人们编写类似 if (haveError) throw std::runtime_error("BOO!"); // May throw std::bad_alloc instead?! 而在其他地方预先构造异常似乎更安全,例如: struct A { // During allocation of A one would often expect std::bad_alloc anyway: A()

2021-06-23 22:10:29    分类:技术分享    c++   exception   out-of-memory

如果不抛出[n async]工厂方法,则缓存结果(caching the result from a [n async] factory method iff it doesn't throw)
问题 更新:@usr指出我误认为Lazy<T>的默认线程安全模式为LazyThreadSafetyMode.PublicationOnly ,进行了LazyThreadSafetyMode.PublicationOnly 。 我想通过async工厂方法(即,它返回Task<T> )来懒惰地计算一个值,并在成功时将其缓存。 作为例外,我想让我可以使用它。 但是,我不想成为Lazy<T>在其默认模式下( LazyThreadSafetyMode.ExecutionAndPublication )具有的异常缓存行为的LazyThreadSafetyMode.ExecutionAndPublication 。 异常缓存:使用工厂方法时,将缓存异常。 也就是说,如果工厂方法在线程第一次尝试访问Lazy对象的Value属性时引发异常,则在以后的每次尝试中都会引发相同的异常。 这样可以确保对Value属性的每次调用都产生相同的结果,并避免了如果不同的线程获得不同的结果可能会引起的细微错误。 懒惰代表实际的T,否则通常会在启动时在某个较早的时间点对其进行初始化。 在较早的时间失败通常是致命的。 如果有可能发生可恢复的故障,我们建议您将重试逻辑构建到初始化例程(在本例中为factory方法)中,就像您不使用惰性初始化一样。 Stephen Toub有一个AsyncLazy类和看起来很合适的文字:

2021-04-12 19:29:02    分类:技术分享    c#   .net   asynchronous   task   lazy-evaluation

将 StackTrace 附加到异常而不抛出 C#/.NET(Attach StackTrace To Exception Without Throwing in C# / .NET)
问题 我有一个组件,它使用返回值而不是标准异常处理来处理错误。 除了错误代码之外,它还返回错误发生位置的堆栈跟踪。 我用来调用组件的包装器将解释返回码并抛出异常。 我想让包装器抛出一个异常,其中包括从组件中捕获的堆栈跟踪信息。 我希望它看起来好像异常是从错误的原始站点抛出的,即使它是在其他地方抛出的。 更具体地说,我希望 Visual Studio 测试运行程序显示的堆栈跟踪反映正确的位置。 有没有办法做到这一点? 如果我能避免访问私有成员的低级反射技巧也很好,但我会尽我所能。 我不关心如何捕获堆栈跟踪,我关心的是将已经捕获的堆栈跟踪附加到异常。 我尝试覆盖 StackTrace 属性,但 Visual Studio 正在从其他地方提取堆栈跟踪数据,并且似乎完全忽略了被覆盖的属性 CustomException GenerateExcpetion() { return new CustomException(); } void ThrowException(Exception ex) { Trace.WriteLine("Displaying Exception"); Trace.WriteLine(ex.ToString()); var edi = ExceptionDispatchInfo.Capture(ex); edi.Throw(); } [TestMethod]

2021-06-24 06:12:32    分类:技术分享    c#   .net

Python:为什么__getattr__捕获AttributeError?(Python: Why is __getattr__ catching AttributeErrors?)
问题 我在与__getattr__挣扎。 我有一个复杂的递归代码库,在其中传播异常非常重要。 class A(object): @property def a(self): raise AttributeError('lala') def __getattr__(self, name): print('attr: ', name) return 1 print(A().a) 结果是: ('attr: ', 'a') 1 为什么这样的行为? 为什么不抛出异常? 未记录此行为(__getattr__文档)。 getattr()可以只使用A.__dict__ 。 有什么想法吗? 回答1 我只是将代码更改为 class A(object): @property def a(self): print "trying property..." raise AttributeError('lala') def __getattr__(self, name): print('attr: ', name) return 1 print(A().a) 并且,正如我们所见,确实首先尝试了该属性。 但是因为它声称不存在(通过引发AttributeError ),所以__getattr__()被称为“最后的手段”。 它没有明确记录,但是可以在“当属性查找在通常位置未找到该属性时调用”下进行计数。 回答2

2021-04-20 15:12:07    分类:技术分享    python   exception   exception-handling   python-3.x   python-2.7

TextReader Read 和 ReadToEnd 挂起而不抛出异常(TextReader Read and ReadToEnd hangs without throwing exception)
问题 有没有办法知道在调用 TextReader.Read 或 TextReader.ReadToEnd 调用之前会挂起而不抛出异常? try { using (var filterReader = new EPocalipse.IFilter.FilterReader(tempFileName)) { mediaContent = filterReader.ReadToEnd(); } } catch (Exception e) { Log.Error("DealerPortalIndex Error on file: " + tempFileName, e, this); mediaContent = string.Empty; } filterReader.ReadToEnd() 挂起并且永远不会在某个 .xls 文件(可能是更多文件)上抛出异常 我也尝试过使用 filterReader.Read(char{}, int, int) 来读取块并遇到同样的问题。 回答1 (您在代码中说 textreader,但该示例使用的是 EPocalips IFilter 模块。) 我认为这是 EPocalipse IFilter 中的一个错误。 我不知道他们的代码是如何更新的,但我记得几年前当我使用 IFilters 并使用 EPocalipse 代码时,效果相同。

2021-07-28 19:16:33    分类:技术分享    c#   ifilter

为什么不在列表上添加(字符串) 传递给 List 参数会抛出异常吗?(Why doesn't add(String) on a List<Integer> passed to a List parameter throw an exception?)
问题 为什么可以在下面的代码中将String插入到List<Integer>中? 我有一个将数字插入整数列表的类: public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(2); list.add(3); list.add(4); Inserter inserter = new Inserter(); inserter.insertValue(list); System.out.print(list); } } 然后我有一个单独的类,它将String插入到List ,数字字符串值为"42" : public class Inserter { void insertValue(List list) { list.add(new String("42")); } } 当我将String添加到整数列表时,为什么编译器不会引发编译器错误,或者运行时会抛出诸如*CastException类的运行时异常? 另外,为什么System.out.print(list)产生如下输出而不抛出任何异常? [2, 3, 4, 42] 允许这一切发生的根本原因是什么? 回答1 这可能是一个说明泛型类型擦除的示例

2021-09-18 09:47:36    分类:技术分享    java   generics

这个声明是什么意思? exception()throw()(what does this declaration mean? exception() throw())
问题 std :: exception类的定义如下 exception() throw() { } virtual ~exception() throw(); virtual const char* what() const throw(); 声明中的throw()语法是什么意思? throw()可以接受参数吗? 没有参数是什么意思? 回答1 不带任何参数,这意味着上述功能,不抛出任何异常。 如果将任何内容指定为参数,则表示该函数将仅引发该类型的异常。 但是请注意,这不是编译器的强制措施。 如果碰巧抛出其他类型的异常,则程序将调用std :: terminate()。 回答2 这是一个“例外规范”。 throw()表示“此函数将不会引发任何异常”。 您还可以指定异常,因此throw(foo)表示此函数可能会抛出foo类型的异常。 C ++社区对此功能的用途进行了很多讨论-总体评价似乎是它并不是特别有用。 有关更多详细信息,请参阅此Herb Sutter文章。 回答3 这是一个例外规范。 没有参数意味着该函数不能引发任何异常。 回答4 这称为抛出规范。 它定义了可以从函数中抛出哪些异常(如果有)。 从理论上讲,这些听起来不错,但是使用它们存在一些问题。 在这个SO问题上可以找到有关此问题的很好的讨论。 回答5 throw()可以接受参数吗? 是的,它可以用来声明允许该方法抛出的参数。

2021-05-24 15:16:29    分类:技术分享    c++   stl

当属性不能为空时使用什么异常类型?(What exception type to use when a property cannot be null?)
问题 在我的应用程序中,如果特定类的属性为 null 或为空(如果它是字符串),我需要抛出异常。 我不确定在这种情况下使用的最佳例外是什么。 我不想创建一个新的异常,我不确定 ArgumentNullException 在这种情况下是否合适。 我应该创建一个新的异常还是可以使用一个异常? 我不介意抛出 ApplicationException。 回答1 标准异常的 MSDN 指南指出: 请使用 value 作为属性设置器的隐式值参数的名称。 下面的代码示例显示了一个属性,该属性在调用方传递空参数时引发异常。 public IPAddress Address { get { return address; } set { if(value == null) { throw new ArgumentNullException("value"); } address = value; } } 此外,属性设计的 MSDN 指南说: 避免从属性 getter 中抛出异常。 属性 getter 应该是没有任何先决条件的简单操作。 如果 getter 可能抛出异常,请考虑将属性重新设计为方法。 此建议不适用于索引器。 由于参数无效,索引器可能会抛出异常。 从属性设置器中抛出异常是有效且可接受的。 所以在null的 setter 中null ArgumentException

2021-06-09 17:59:27    分类:技术分享    c#   .net   exception

事件处理程序中的“对 SetCurrentCellAddressCore 的可重入调用”——仅当单元格的行和列索引相等时(“reentrant call to SetCurrentCellAddressCore” in event handlers - only where cell row and column indices are equal)
问题 我正在制作一个 WinForms 应用程序,其中包含一个使用DataGridView处理简单数据操作的表单。 为了确保在减轻混乱的同时准确输入(阅读:不使用DataGridViewComboBoxColumn )我有几个事件处理程序,它们临时将DataGridViewTextBoxCell转换为等效的DataGridViewComboBoxCell连接到在引发编辑事件时已知为“干净”的值(通常当可编辑单元格为点击): private void OnCellEndEdit(object sender, DataGridViewCellEventArgs e) { //construct a textbox cell and set to current value DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell(); cell.Value = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; //color row if invalid or modified UpdateRowStyle(dataGridView.Rows[e.RowIndex]); //switch to the new cell and redraw

2021-09-16 19:27:02    分类:技术分享    c#   winforms   exception   datagridview   event-handling

如何检测ExpandoObject上是否存在属性?(How to detect if a property exists on an ExpandoObject?)
问题 在javascript中,您可以使用undefined关键字检测是否定义了属性: if( typeof data.myProperty == "undefined" ) ... 在C#中,如何使用带有ExpandoObject的dynamic关键字而不抛出异常来执行此操作? 回答1 根据MSDN,声明显示它正在实现IDictionary: public sealed class ExpandoObject : IDynamicMetaObjectProvider, IDictionary<string, Object>, ICollection<KeyValuePair<string, Object>>, IEnumerable<KeyValuePair<string, Object>>, IEnumerable, INotifyPropertyChanged 您可以使用它来查看是否定义了成员: var expandoObject = ...; if(((IDictionary<String, object>)expandoObject).ContainsKey("SomeMember")) { // expandoObject.SomeMember exists. } 回答2 这里需要进行重要的区分。 这里的大多数答案都是特定于问题中提到的ExpandoObject的。

2021-04-10 12:54:52    分类:技术分享    c#   dynamic   expandoobject

检查注册表权限而不抛出异常(Check registry permission without throwing exception)
问题 我有一段这样的代码 try { RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\xxxx\\yyyyy"); // more code } catch { } 我不喜欢使用空的 catch 块。 但是,它很有用,因为如果用户没有访问注册表的权限,则不应执行任何操作。 这段代码被多次调用,除了不好的做法,我认为它的性能很差。 我一直在寻找一种方法来在尝试访问它之前检查注册表权限,但我发现这样做的唯一方法是检查异常 RegistryPermission.Demand() 并检查异常。 所以,这对我最初的方法没有任何好处。 ¿ 有没有办法检查注册表访问权限而无需人为抛出或不必检查异常? 编辑: 好吧,看起来 .NET 首选的方法是尝试访问资源并检查异常。 Yannick 指出的文章显示了处理 Windows 安全模型、手动查找所需访问权限是多么复杂。 所以,我要做的是稍微重新设计这段代码,以便它只检查一次访问(捕获异常)并保留该信息,而不是不断抛出异常。 这样做的缺点是,如果用户“即时”更改安全设置,代码将继续拒绝访问注册表。 但是,如果没有一种检查访问的简单而干净的方法,则这是首选。 回答1 既然你正在创建一个新的密钥,你不应该只检查一次父级的权限吗? 编辑:我不确定是否有托管方式,但您可以在

2021-06-09 13:49:37    分类:技术分享    c#   .net   exception   registry

Contract.Assert 不抛出编译错误(Contract.Assert do not throw compilation error)
问题 我正在尝试使用 Contract 在编译时为我的类型添加验证,但不幸的是它不起作用。 例如下面的代码在编译项目时不会给出编译器错误。 我应该启用一些东西吗? Contract.Assert(false, "Invalid state!"); 回答1 是的,您需要启用静态检查。 进入项目属性并访问“代码合同”选项卡。 当然,您首先需要安装静态检查器扩展,IIRC 仅适用于 Visual Studio Ultimate。 有关可用的确切选项的详细信息,请参阅用户文档。 请注意,这发生在初始编译阶段之后,因此有时您会看到构建的第一部分和静态检查器的结果之间存在延迟。 (这不是真正的“编译器”错误——而是“合同检查”错误。)

2021-07-28 14:57:10    分类:技术分享    c#   compiler-construction   compiler-errors

使用 boost::filesystem 遍历目录而不抛出异常(Traversing a directory with boost::filesystem without throwing exceptions)
问题 我有一个目录的路径,我想遍历它的所有子目录,顺便收集文件的路径。 namespace fs = boost::filesystem; std::vector<fs::path> traverse_if_directory(fs::path& f) { std::vector<fs::path> result; if (fs::is_directory(f)) { for (fs::recursive_directory_iterator it(f), eit; it != eit; ++it) { if (!fs::is_directory(it->path())) { result.push_back(it->path()); } } } else { result.push_back(f); } return result; } 不幸的是,在遍历的过程中,我偶然发现了一个我无权查看的目录,并且上面的代码抛出了。 但显然,在这种情况下,这也不例外,我应该继续,跳过这个锁定的目录。 但是我该怎么做呢? 回答1 哈,想通了,有办法: std::vector<fs::path> traverse_if_directory(fs::path& f) { std::vector<fs::path> result; boost::system::error_code ec; if

2021-07-11 16:28:12    分类:技术分享    c++   boost   boost-filesystem

File.mkdir或mkdirs返回false-原因?(File.mkdir or mkdirs return false - Reason?)
问题 为什么file.mkdir返回false? Google指出可能有多种原因(例如安全性,权限,路径名等)。 我的问题: 如何找到返回假的确切原因? 如果安全/权限是一个原因,那么为什么不抛出SecurityException? 回答1 如果安全性/权限是一个原因,那么为什么不抛出SecurityException(在Javadoc中提到)? 当您没有JVM级别的权限(而不是操作系统级别)来执行某项操作时,会抛出SecurityException 有没有办法找到返回false的确切原因? 不,AFAIK。 唯一知道的方法是自己检查目录的权限,在调用它们之前确保它不存在,检查父目录是否存在,等等。 但是,如果您使用的是Java 7或更高版本,则可以使用NIO来创建目录。 具体来说,Files.createDirectory: File dir = new File("mydir"); Files.createDirectory(dir.toPath()); 如果要完全使用NIO而不使用java.io.File ,则可以使用Paths.get来创建Path : Path dir = Paths.get("mydir"); Files.createDirectory(dir); 在这两种情况下,如果都无法创建目录,它将抛出IOException并给出操作失败的确切原因。

2021-04-22 03:09:20    分类:技术分享    java   file   javadoc   mkdir

为什么 try-with-resources catch 块是选择性可选的?(Why is try-with-resources catch block selectively optional?)
问题 我读到 try-with-resources 中的catch块是可选的。 我尝试在 try-with-resources 块中创建一个Connection对象,没有后续的catch块,只是为了从 eclipse 中获取编译器错误:“自动close()调用抛出的未处理的异常类型SQLException 。” 由于可以在 try-with-resources 中使用的每个资源都实现AutoCloseable ,因此在调用close()方法时可能会抛出异常,我不明白catch子句是如何可选的,因为它不允许我跳过从close()捕获异常。 是否有一些特殊要求AutoCloseable的具体实现不直接声明其close()方法中抛出的任何异常? (例如覆盖AutoCloseable的close() throws Exception使用不抛出任何异常的close()抛出异常)? ..或者这可能只是日食问题? 编辑:这是仍然触发问题的最简单的代码片段: try (Connection con = dataSource.getConnection()) { /*...*/ } 关于这是否与使用 JNDI 数据源有关的想法? 提前致谢。 回答1 如果close()无法抛出已检查的异常,则它是可选的。 但是,如果close()可以,则需要以正常方式处理已检查异常,要么使用catch块,要么从try

2021-06-12 10:24:04    分类:技术分享    java   try-with-resources   autocloseable

测试sql连接不抛出异常(Test sql connection without throwing exception)
问题 为了测试我是否可以连接到我的数据库,我执行以下代码: using (SqlConnection connection = new SqlConnection(myConnectionString)) { try { connection.Open(); canConnect = true; } catch (SqlException) { } } 这有效,除非它在连接失败时抛出异常。 有没有其他方法可以测试不引发异常的 Sql 连接? 编辑:为了增加精度,我问是否有一种简单的方法可以做到这一点而无需打开连接并捕获可能发生的异常 回答1 尝试打开连接时,如果无法打开连接,则无法避免异常。 它可以隐藏在某个函数中,但无论如何你都会得到异常。 它是这样设计的,因为通常您希望能够连接到数据库。 失败的连接是个例外。 也就是说,您可以随时通过检查State属性来测试当前连接状态。 回答2 像这样写一个扩展: public static class Extension{ public static bool CanOpen(this SqlConnection connection){ try{ if(connection == null){ return false; } connection.Open(); var canOpen = connection.State ==

2021-09-14 07:03:01    分类:技术分享    c#   exception   sqlconnection

我可以在不抛出异常的情况下测试正则表达式在C#中是否有效(Can I test if a regex is valid in C# without throwing exception)
问题 我允许用户输入正则表达式来匹配IP地址,以便在相关系统中进行IP过滤。 我想验证输入的正则表达式是否有效,因为很多用户出于良好的意愿会搞砸操作。 我当然可以在try / catch中执行Regex.IsMatch()并查看它是否炸毁,但是有没有更聪明的方法呢? 速度不是问题,我只是更喜欢避免无缘无故地抛出异常。 回答1 只要您捕获非常具体的异常,就可以尝试/捕获。 如果使用得当,异常不是邪恶的。 回答2 我认为在这种情况下例外是可以的。 只要确保短路并消除例外,您就可以: private static bool IsValidRegex(string pattern) { if (string.IsNullOrWhiteSpace(pattern)) return false; try { Regex.Match("", pattern); } catch (ArgumentException) { return false; } return true; } 回答3 并非没有很多工作。 正则表达式的解析非常复杂,并且在框架中没有公开的用于验证表达式的内容。 System.Text.RegularExpressions.RegexNode.ScanRegex()看起来是负责解析表达式的主要函数,但它是内部函数(无论如何,都会抛出任何无效语法的异常)。 因此

2021-04-30 10:27:07    分类:技术分享    c#   regex