2

Gibt es eine Möglichkeit, in MATLAB eine switch-Anweisung zu verwenden, um ein Zellenarray mit Strings zu bearbeiten, so dass die erste case-Anweisung ausgeführt wird, deren string-Argument mit einem der Strings im Zellenarray übereinstimmt ?MATLAB-Schaltergehäuse mit Zellenfeld mit Strings

Der Kontext dieses Problems liegt in der Behandlung von Fehlern in einem catch Block.

Nehmen wir an, ich versuche, eine Bilddatei zu laden:

path = 'c:\where my files are located'; 
format = 'MRIm%03d.dcm'; 

try 
    firstheader = dicomread(fullfile(path, sprintf(format, 1))); 
catch ex 
    % extract last segment of exception identifier 
    idSegLast = regexp(ex.identifier, '(?<=:)\w+$', 'match'); 

    switch idSegLast 
     case 'noFileOrMessagesFound' 
      disp('No File Or Messages Found'); 
      return; 
     case 'fileNotFound' 
      disp('File Not Found'); 
      return; 
     otherwise 
      rethrow(ex); 
    end 
end 

Die switch Anweisung im Code oben nicht funktioniert, weil idSegLast eine Zelle Array von Strings ist. In den meisten Fällen hat idSegLast nur ein Element, aber möglicherweise mehrere Elemente, wenn mehrere Ausnahmen ausgelöst werden.

Natürlich ist die switch-Anweisung oben kann (was nicht funktioniert) mit dem folgenden if-else-Block ersetzt werden, die das gewünschte Verhalten implementiert:

if (strcmp(idSegLast, 'noFileOrMessagesFound')) 
    disp('No File Or Messages Found'); 
    return; 
elseif (strcmp(idSegLast, 'fileNotFound')) 
    disp('File Not Found'); 
    return; 
else 
    rethrow(ex); 
end 

jedoch als zusätzliche Ausnahmebehandlung hinzugefügt werden der Code, wird es unweigerlich weniger lesbar als ein switch - case Konstrukt wäre. Ich versuche immer, die Qualität meines Codes und seine Lesbarkeit zu verbessern. Gibt es einen besseren Weg?

+1

Sind Sie sicher, dass Ihre Implementierung mit 'if' wie vorgesehen funktioniert ?. Denn soweit ich sehen kann 'if ([1; 0])' wird als falsch gewertet –

+0

Was ist das Problem mit der 'if-else' Option? Es ist absolut lesbar. – Adiel

+0

Und für @NoelSeguraMeraz Frage, nehme ich an, dass Sie 'wenn überhaupt (strcmp (....))' schreiben möchten – Adiel

Antwort

1

Sie können ismember zusammen mit einer Liste der Ausnahmen verwenden, die Sie verfolgen möchten, um den Zellenstring idSegLast zu analysieren. Es ist ungeschickt, aber es scheint für mich zu funktionieren.

switch num2str(ismember({'noFileOrMessagesFound', 'fileNotFound'}, ... 
     idSegLast)) 
    case '1 0' 
     disp('No File Or Messages Found'); 
     return; 
    case '0 1' 
     disp('File Not Found'); 
     return; 
    case '1 1' % don't know if it's possible, but better safe than sorry 
     disp('No File Or Messages Found and File Not Found'); 
     return; 
    otherwise 
     rethrow(ex); 
end