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 | Design |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
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
- Döntősök
- Megsemmisítési módszerek
- Egyenlőségi operátorok
- Implicit öntött operátorok
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 a lehető legnagyobb mértékben úgy kell viselkedniük, mint egy mező. A mezők nem adnak kivételt, és a tulajdonságoknak sem kell. 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:
- System.InvalidOperationException és az összes származék (beleértve a System.ObjectDisposedException)
- System.NotSupportedException és az összes származék
- System.ArgumentException (csak indexelt get)
- System.Collections.Generic.KeyNotFoundException (csak indexelt get)
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:
- System.InvalidOperationException és az összes származék (beleértve a System.ObjectDisposedException)
- System.NotSupportedException és az összes származék
- System.ArgumentException és származékok
Egyenlő metódusok
A következő Egyenlő metódusok nem szabad kivételeket kivenni:
Egy Equals
metódusnak vissza kell térnie true
, vagy false
ahelyett, hogy kivételt kellene eredményeznie. Ha például Equals
két nem egyező típust ad át, akkor csak vissza kell térnie false
a dobás ArgumentExceptionhelyett.
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, egy ArgumentException. 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 konstruktor kivételeinek kivédése miatt a típus nem használható az aktuális alkalmazástartományban. Egy statikus konstruktor kivételének oka (például biztonsági probléma) kell, hogy legyen.
Döntősö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 döntőbe.
Megsemmisítési módszerek
A System.IDisposable.Dispose metódusok nem hozhatnak kivételt. Dispose
gyakran nevezik egy záradék törlési logikájának finally
részeként. Ezért explicit módon kivételt kell kivennie a felhasználótól Dispose
, hogy kivételkezelést adjon hozzá a finally
záradékon belül.
A Dispose(false)
kód elérési útja soha nem vethet ki kivételeket, mert Dispose
szinte mindig egy döntőstől hívjuk meg.
Egyenlőségi operátorok (==, !=)
A módszerekhez hasonlóan Equals
az egyenlőségi operátoroknak is vissza kell térnie true
vagy false
, és nem szabad kivételeket kivenni.
Implicit öntött operátorok
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.