== Why is this an issue?

The rule is reporting when an exception is thrown from certain methods and constructors. These methods are expected to behave in a specific way and throwing an exception from them can lead to unexpected behavior and break the calling code.

[source,csharp]
----
public override string ToString()
{
  if (string.IsNullOrEmpty(Name))
  {
    throw new ArgumentException(nameof(Name));  // Noncompliant
  }
  //...
}
----

An issue is raised when an exception is thrown from any of the following:

* https://learn.microsoft.com/en-us/dotnet/api/system.object.tostring[ToString]
* https://learn.microsoft.com/en-us/dotnet/api/system.object.equals[Object.Equals]
* https://learn.microsoft.com/en-us/dotnet/api/system.iequatable-1.equals[IEquatable.Equals]
* https://learn.microsoft.com/en-us/dotnet/api/system.object.gethashcode[GetHashCode]
* https://learn.microsoft.com/en-us/dotnet/api/system.idisposable.dispose[IDisposable.Dispose]
* https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-implement-custom-event-accessors[Event accessors]
* https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors[static constructors]
* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/module-initializers[Module initializers]
* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/operator-overloading[operators ==, !=, <, >, <=, >=]
* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/user-defined-conversion-operators[implicit cast operators]

=== Exceptions

Certain exceptions will be ignored in specific contexts, thus not raising the issue:

* `System.NotImplementedException` and its derivatives are ignored for all the aforementioned.

* `System.InvalidOperationException`, `System.NotSupportedException`, and `System.ArgumentException` and their derivatives are ignored in event accessors.

== Resources

=== Documentation

* https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/exceptions/[Exceptions and Exception Handling]
* https://learn.microsoft.com/en-us/dotnet/standard/exceptions/best-practices-for-exceptions[Best practices for exceptions]
* https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1065[CA1065: Do not raise exceptions in unexpected locations]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Remove this "throw" statement.


=== Highlighting

``++throw xxx++``


'''
== Comments And Links
(visible only on this page)

=== on 8 Mar 2017, 14:03:45 Ann Campbell wrote:
FYI [~amaury.leve] our standard is AmE, so double quotes, not single quotes.

=== on 8 Mar 2017, 19:32:18 Ann Campbell wrote:
\[~amaury.leve] did you mean ``++Equals(Object)++`` rather than ``++Object.Equals++``?

endif::env-github,rspecator-view[]
