CA1065: Ne emeljen kivételeket váratlan helyeken

Tulajdonság Érték
Szabályazonosító CA1065
Cím Ne emeljen kivételeket váratlan helyeken
Kategória Tervezés
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Nem
Alkalmazandó nyelvek C# és Visual Basic

Ok

Az a metódus, amely várhatóan nem ad kivételeket, kivételt eredményez.

Szabály leírása

Azok a metódusok, amelyektől nem várható kivétel, az alábbiak szerint kategorizálhatók:

  • Tulajdonság lekérési módszerei
  • Eseménykiegészítési módszerek
  • Egyenlő metódusok
  • GetHashCode metódusok
  • ToString metódusok
  • Statikus konstruktorok
  • Finalizálók
  • Megsemmisítési módszerek
  • Egyenlőségi operátorok
  • Implicit kényszerítési operátor

A következő szakaszok ezeket a metódustípusokat ismertetik.

Tulajdonság lekérési módszerei

A tulajdonságok alapvetően intelligens mezők. Ezért amennyire lehet, úgy kell működniük, mint egy mező. A mezők nem okoznak kivételeket, és a tulajdonságoknak sem szabadna. Ha olyan tulajdonsága van, amely kivételt jelez, fontolja meg módszerként.

A következő kivételeket lehet kivenni egy tulajdonság get metódusából:

Eseménykiegészítési módszerek

Az eseménykiegészítőknek olyan egyszerű műveleteknek kell lenniük, amelyek nem vetnek ki kivételeket. Eseménykezelő hozzáadásakor vagy eltávolításakor az esemény nem adhat kivételt.

Az alábbi kivételeket lehet kivenni egy eseménykiegészítőből:

Egyenlő metódusok

A következő Equals metódusok nem dobhatnak kivételeket:

Egy Equals metódusnak true-t vagy false-t kellene visszaadnia ahelyett, hogy kivételt eredményezne. Ha például Equals két nem egyező típust ad át, akkor csak vissza kell térnie false ahelyett, hogy egy ArgumentException dobna.

GetHashCode metódusok

A következő GetHashCode metódusok általában nem szabad kivételeket okozni:

GetHashCode mindig egy értéket kell visszaadnia. Ellenkező esetben a kivonattáblában lévő elemek elveszhetnek.

Azok a GetHashCode verziók, amelyek argumentumot vesznek fel, kiválthatnak egy ArgumentException-t. Azonban soha Object.GetHashCode nem szabad kivételt kivenni.

ToString metódusok

A hibakereső a sztringformátumú objektumok adatainak megjelenítését segíti System.Object.ToString . ToString Ezért ne módosítsa egy objektum állapotát, és ne dobja ki a kivételeket.

Statikus konstruktorok

A statikus konstruktorból történő kivételdobás miatt a típus nem használható az aktuális alkalmazási doménben. Egy statikus konstruktor kivételének oka (például biztonsági probléma) kell, hogy legyen.

Finalizálók

Ha kivételt ad egy véglegesítőből, a CLR gyorsan meghiúsul, ami megszakítja a folyamatot. Ezért ne dobjon kivételeket a véglegesítőben.

Megsemmisítési módszerek

A System.IDisposable.Dispose metódusok nem hozhatnak kivételt. A(z) Dispose-t gyakran hívják meg egy finally záradék takarítási logikájának részeként. Ezért a Dispose elemből történő kivételdobás hatására a felhasználónak a finally záradékon belül kell kivételkezelést hozzáadnia.

A Dispose(false) kódútvonalnak soha nem szabad kivételeket okoznia, mert a Dispose szinte mindig egy finalizálótól van meghívva.

Egyenlőségi operátorok (==, !=)

A módszerekhez hasonlóan Equals az egyenlőségi operátoroknak is vissza kell térniük true vagy false, és nem szabad kivételt dobniuk.

Implicit kényszerítési operátor

Mivel a felhasználó gyakran nem tud arról, hogy implicit öntött operátort hívtak meg, az implicit öntött operátor által okozott kivétel váratlan. Ezért nem szabad kivételeket kivenni az implicit öntött operátorokból.

Szabálysértések kijavítása

A tulajdonságbeolvasók esetében módosítsa a logikát úgy, hogy többé ne kelljen kivételt kivennie, vagy módosítsa a tulajdonságot metódussá.

A korábban felsorolt összes többi metódustípus esetében módosítsa a logikát, hogy többé ne kell kivételt kivennie.

Mikor kell letiltani a figyelmeztetéseket?

Ha a szabálysértést nem a kidobott kivétel, hanem egy kivétel deklarációja okozta, nyugodtan letilthatja a szabály figyelmeztetését.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Lásd még