Overflow Exception Checking Problem

4

Sfondo

Devo chiamare un metodo che deve restituire un intero con segno (vedi il blocco di codice sotto) dopo la conversione da un intero non firmato . La ragione di questo è che devo fare matematica di bit-saggio che si basa sul valore che inizia come un intero senza segno.

Stavo pensando di fare il try / catch con il controllo del metodo che MSDN descrive qui . Il mio unico problema con questo metodo è che, mentre voglio gestire l'eccezione in modo appropriato ... Non è possibile prevedere quali significati potrebbero avere i numeri per il chiamante. Ciò che intendo è che chiunque chiami GetMode utilizzerà il valore per cercare un string che fornisce un ulteriore significato di ciò che significa il modo in realtà.

mode = object.GetMode(3);

Dove GetMode è definito come segue.

public int GetMode(int index)
{
    UInt32 modeUint = 0;
    int modeInt = 0;

    // extract the number from the array
    modeUint = this.myArray[index];

    // convert to a signed integer
    modeInt = Convert.ToInt32(modeUint); 

    return modeInt;
}

La struttura della classe

La classe è strutturata nel modo seguente:

I campi:

  1. myArray
  2. MyDictionary
  3. modeIndex = 3

Metodi di costruzione:

  1. Voce ()
  2. Voce (dati UInt32)

Metodi di accesso pubblici:

  1. int GetMode (int index)
  2. int GetModeDescription

Quindi il modo in cui questa classe funziona, è ...

  1. La classe è costruita con una serie di dati.
  2. La classe crea myArray come copia esatta dei dati con cui è stata costruita la classe.
  3. La classe costruisce un dizionario da un file XML molto grande, che contiene i significati delle varie modalità (s).
  4. La classe sarà quindi accessibile da un estraneo, chiedendo informazioni sulla modalità (s).
  5. Se viene chiamato GetMode , verrà restituito il numero di modalità (dopo essere stato estratto da una posizione fissa in myArray .
  6. Se viene chiamato GetModeDescription , verrà utilizzato il primo GetMode per ottenere il numero associato alla modalità. Questo numero sarà a sua volta utilizzato come chiave per cercare un valore dal dizionario al fine di ottenere la descrizione della stringa appropriata.

Domanda

Voglio evitare che utilizzi male una delle modalità (ad esempio, rilevi l'eccezione, restituisci 0). Quindi stavo pensando di fare una delle seguenti azioni:

  1. Non fare nulla sull'eccezione, l'utente ha violato il mio contratto ed è colpa loro.
  2. Rileva l'eccezione e la rilancia con il messaggio originale più alcune informazioni aggiuntive su come il numero restituito non è valido.
  3. Basta ripetere l'eccezione.

Uno di questi è accettabile o esiste un altro modo?

    
posta Snoop 04.04.2016 - 17:57
fonte

1 risposta

0

Se ho capito bene, la tua domanda è se e come verificare se

// convert to a signed integer
modeInt = Convert.ToInt32(modeUint); 

lancia una OverflowException perché modeUint = this.myArray[index]; contiene un numero intero senza segno troppo grande per adattarsi.

Offro quanto segue:

  • Non non controlla qui , perché i dati errati sono già stati caricati in un membro del tuo oggetto ( myArray )

  • Fai controlla nel costruttore, dove:

The class builds myArray as an exact copy of the data with which the class was constructed.

e genera un'eccezione appropriata lì.

    
risposta data 04.04.2016 - 20:40
fonte

Leggi altre domande sui tag