Användning av try-catch i programmering.

Permalänk

Användning av try-catch i programmering.

public Card DrawCard() { CheckForShuffle(); try { Debug.WriteLine(cards[0].GetSuite()); Card card = new Card(); card = cards[0]; cards.RemoveAt(0); return card; } catch(System.ArgumentOutOfRangeException) { Debug.WriteLine("ArgumentOutOfRangeException: Card is null"); ReShuffle("Yes"); Card card = cards[0]; cards.RemoveAt(0); return card; } }

Som ni ser i koden ovanför så använder jag catch delen som för att bestämma när en kortlek behöver blandas om. Finns det något negativt med att man gör detta, borde jag undvika det och i sånna fall varför?

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Medlem

Här finns generella råd för exceptions:

https://learn.microsoft.com/sv-se/dotnet/csharp/fundamentals/...

Jag tycker inte riktigt att felmeddelandet matchar det exception som du fångar.

Vilken eller vilka rader är det som du vill skydda från System.ArgumentOutOfRangeException?

Edit: Du skulle t.ex. kunna använda dig av en kontroll för ifall cards har några objekt.

Permalänk
Avstängd

Det är bad practise, det är dessutom mer ineffektivt. Exceptions används för att hantera oväntat beteende, att kortleken är tom är förväntat beteende.

Att tillägga borde du inte instansiera card när du drar kort. Varför har du "CheckForShuffle" i denna metoden?

Såhär borde metoden se ut:

public Card DrawCard() { if(!cards.Any()) { return null; } var card = cards[0]; cards.RemoveAt(0); return card; }

Permalänk
Medlem

Utöver vad tidigare skribenter skrivit så tänk även på att DrawCards() för en utomstående läsare ger sken av att dra kort. Inte att även blanda om kortleken. Var tydlig, om du nu överhuvudtaget ska behålla den delen där!

Permalänk
Skrivet av MaskenLilja:

public Card DrawCard() { CheckForShuffle(); try { Debug.WriteLine(cards[0].GetSuite()); Card card = new Card(); card = cards[0]; cards.RemoveAt(0); return card; } catch(System.ArgumentOutOfRangeException) { Debug.WriteLine("ArgumentOutOfRangeException: Card is null"); ReShuffle("Yes"); Card card = cards[0]; cards.RemoveAt(0); return card; } }

Som ni ser i koden ovanför så använder jag catch delen som för att bestämma när en kortlek behöver blandas om. Finns det något negativt med att man gör detta, borde jag undvika det och i sånna fall varför?

Du ska absolut inte använda try/catch för logik, det är enbart till för felhantering.

Hela poängen med en catch är att du hoppar dit om du får ett oväntat fel, du vill inte ha logik som inte handlar om att hantera det ett fel i där efter som du per definition inte vet när du kommer dit.

Det är också extremt kostsamt att kasta ett exception, din applikation kommer vara mycket långsammare än om du hanterat logiken korrekt.

[edit, så kan det gå när man går och hämtar kaffe medan man skriver inlägg :)]

Permalänk
Avstängd

Det naturliga blir såklart att fråga sig hur man definerar "förväntat beteende" och när man faktiskt ska använda exceptions eller hantera exceptions. Det kan bli lite svårare att bestämma i mer komplexa system, men generellt - om du kan hantera något och det faktiskt finns något vettigt man kan göra i ett scenario så ska man göra det utan exceptions. Sedan kan du själv skriva en metod som du vill ska fungera på exakt ett visst sätt, men om någon annan försöker använda den på ett annat sätt än du tänkt så kan du själv kasta ett lämpligt exception (eller ditt egna exception). Detta lär man sig mer med tiden då man kodat å läst annans kod... Finns säkert en bra defintion om man googlar lite dock

Permalänk
Skrivet av Matvraket:

Det är bad practise, det är dessutom mer ineffektivt. Exceptions används för att hantera oväntat beteende, att kortleken är tom är förväntat beteende.

Att tillägga borde du inte instansiera card när du drar kort. Varför har du "CheckForShuffle" i denna metoden?

Såhär borde metoden se ut:

public Card DrawCard() { if(!cards.Any()) { return null; } var card = cards[0]; cards.RemoveAt(0); return card; }

Om jag försöker skicka tillbaka null så får jag problem i andra delar av koden då en annan metod försöker använda detta null kort.
Det är därför

ReShuffle("Yes"); Card card = cards[0]; cards.RemoveAt(0); return card;

finns med så att metoden alltid skickar tillbaka ett kort. Jag skulle dock kunna flytta innehållet inom catch till din if sats så att metoden fortfarande skickar tillbaka ett kort icke null kort.

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Skrivet av Curik:

Utöver vad tidigare skribenter skrivit så tänk även på att DrawCards() för en utomstående läsare ger sken av att dra kort. Inte att även blanda om kortleken. Var tydlig, om du nu överhuvudtaget ska behålla den delen där!

Tanken är ju att shuffle() bara ska hända om man försöker dra ett kort som inte finns.

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Avstängd
Skrivet av MaskenLilja:

Om jag försöker skicka tillbaka null så får jag problem i andra delar av koden då en annan metod försöker använda detta null kort.
Det är därför

ReShuffle("Yes"); Card card = cards[0]; cards.RemoveAt(0); return card;

finns med så att metoden alltid skickar tillbaka ett kort. Jag skulle dock kunna flytta innehållet inom catch till din if sats så att metoden fortfarande skickar tillbaka ett kort icke null kort.

Där du använder DrawCard metoden så bör du hantera att du får tillbaka null, null betyder ju att det inte finns något kort kvar i kortleken.

Permalänk
Avstängd
Skrivet av MaskenLilja:

Tanken är ju att shuffle() bara ska hända om man försöker dra ett kort som inte finns.

Om du vill att metoden ska kunna göra mer än en sak aka "dra ett kort" så bör du döpa om metoden.

Permalänk
Avstängd
Skrivet av MaskenLilja:

Tanken är ju att shuffle() bara ska hända om man försöker dra ett kort som inte finns.

Fast Shuffle gör väl inget om det inte finns några kort?

Permalänk
Medlem
Skrivet av MaskenLilja:

Tanken är ju att shuffle() bara ska hända om man försöker dra ett kort som inte finns.

Nja, bättre att tänka på det som att du vill köra shuffle innan du försöker dra ett kort (om vi bortser från det underliga i att blanda en tom kortlek och sånt ):

if (cards.Count == 0) { ReShuffle("Yes"); } Card card = cards[0]; cards.RemoveAt(0); return card;

Om du har en try-catch där du måste upprepa en massa kod i både try och catch så gör du troligtvis något fel.

Permalänk
Avstängd

@MaskenLilja

När man kodar så är det inte bara viktigt att det fungerar, självklart är det prio ett, men sedan måste man också skriva bra kod som är väldigt läsbar och lätt att underhålla. Du läser kanske kod 80% av tiden och skriver kod 20%, ibland läser du 99% å sedan tar kodändringen 1 min. Iaf i ett moget projekt, de flesta sitter med sådan kod varje dag. Bygger du allt från scratch så är det en annan sak, men det blir ju tillslut mogen kod så att säga...

Allt du skriver säger något till nästa programmerare som läser din kod. Det är ett språk i sig att skriva kod på ett sätt som andra förstår, inte bara att det fungerar.

Permalänk
Medlem
Skrivet av MaskenLilja:

Tanken är ju att shuffle() bara ska hända om man försöker dra ett kort som inte finns.

Jag förstår men det är som @Matvraket säger, nästa person som läser behöver kunna förstå. Denna nästa person kan även vara du om några dagar/veckor/månader/år. Och om jag anropar din metod så vill jag ju veta om den har några sidoeffekter. I det här fallet finns det en ganska stor sådan som är att man blandar om kortleken. Det kan bli väldigt förvirrande även om det inte är en jättestor grej.