C # try-catch-else

.Net Framework, как правило, имеет обратную совместимость, поэтому вы можете загружать сборку .Net 3.5 в среду выполнения .NET, но не наоборот.

Вы должны настроить таргетинг своих сборок на самую низкую поддерживаемую версию времени выполнения.

Вот несколько дополнительных чтений, которые должны отвечать на большинство ваших вопросов ...

https://msdn.microsoft.com/en-us/ библиотека / ff602939 (v = vs.110) .aspx

29
задан Marius 8 March 2010 в 10:54
поделиться

12 ответов

Если Вы, оказывается, находитесь в цикле, то можно поместить продолжать оператор в блоки выгоды. Это заставит остающийся код того блока быть пропущенным.

, Если Вы не находитесь в цикле, тогда нет никакой потребности поймать исключение на этом уровне. Позвольте ему распространить стек вызовов к блоку выгоды, который знает, что сделать с ним. Вы делаете это путем устранения всей платформы попытки/выгоды на текущем уровне.

мне нравится попытка/кроме/еще в Python также, и возможно они будут добавлены к C# однажды (точно так же, как несколько возвращаемых значений были). Но если Вы думаете об исключениях немного по-другому, еще блоки не строго необходимы.

0
ответ дан 27 November 2019 в 21:42
поделиться

Catch a specific class of exceptions

try
{
    reader = new StreamReader(path);
    string line = reader.ReadLine();
    char character = line[30];
}
catch (IOException ex)
{
    // Uh oh something went wrong with I/O
}
catch (Exception ex)
{
    // Uh oh something else went wrong
    throw; // unless you're very sure what you're doing here.
}

The second catch is optional, of course. And since you don't know what happened, swallowing this most general exception is very dangerous.

46
ответ дан 27 November 2019 в 21:42
поделиться

Вы можете написать это так:

bool success = false;
try {
    reader = new StreamReader(path);
    success = true;
}
catch(Exception) {
    // Uh oh something went wrong with opening the file for reading
}
finally {
    if(success) {
        string line = reader.ReadLine();    
        char character = line[30];
    }
}   
12
ответ дан 27 November 2019 в 21:42
поделиться

You can do this:

try
{
    reader = new StreamReader(path);
}
catch (Exception)
{
    // Uh oh something went wrong with opening the file for reading
}

string line = reader.ReadLine();
char character = line[30];

But of course, you will have to set reader into a correct state or return out of the method.

8
ответ дан 27 November 2019 в 21:42
поделиться

Catch more specific exceptions.

try {
   reader = new StreamReader(path);
   string line = reader.ReadLine();
   char character = line[30];
}
catch(FileNotFoundException e) {
   // thrown by StreamReader constructor
}
catch(DirectoryNotFoundException e) {
   // thrown by StreamReader constructor
}
catch(IOException e) {
   // some other fatal IO error occured
}

Further, in general, handle the most specific exception possible and avoid handling the base System.Exception.

6
ответ дан 27 November 2019 в 21:42
поделиться

Исключения в .NET используются иначе; они предназначены только для исключительных условий.

Фактически, вы не должны перехватывать исключение, если не знаете, что оно означает, и не можете что-то с этим сделать .

4
ответ дан 27 November 2019 в 21:42
поделиться

More idiomatically, you would employ the using statement to separate the file-open operation from the work done on the data it contains (and include automatic clean-up on exit)

try {
  using (reader = new StreamReader(path))
  {
    DoSomethingWith(reader);
  }
} 
catch(IOException ex)
{
  // Log ex here
}

It is also best to avoid catching every possible exception -- like the ones telling you that the runtime is about to expire.

2
ответ дан 27 November 2019 в 21:42
поделиться

У вас может быть несколько предложений перехвата, каждое из которых зависит от типа исключения, которое вы хотите перехватить. Итак, если вы хотите только перехватить IOExceptions, вы можете изменить свое предложение catch на следующее:

try
{
    reader = new StreamReader(path);
    string line = reader.ReadLine();
    char character = line[30];
}
catch (IOException)
{    
}

Все, кроме IOException, затем будет распространяться вверх по стеку вызовов. Если вы хотите также обрабатывать другие исключения, вы можете добавить несколько предложений об исключениях, но вы должны убедиться, что они добавляются в наиболее конкретном или наиболее общем порядке. Например:

try
{
    reader = new StreamReader(path);
    string line = reader.ReadLine();
    char character = line[30];
}
catch (IOException)
{    
}
catch (Exception)
{
}
2
ответ дан 27 November 2019 в 21:42
поделиться

Вы также можете вкладывать свои инструкции try

2
ответ дан 27 November 2019 в 21:42
поделиться

Есть ли подобная конструкция, которую я могу использовать в C # добиться того же?

Нет.

Оберните средство доступа к индексу оператором if, который является лучшим решением в вашем случае в случае производительности и удобочитаемости.

if (line.length > 30) {
   char character = line [30];
} 
1
ответ дан 27 November 2019 в 21:42
поделиться

После просмотра других предложенных решений, вот мой подход:

try {
    reader = new StreamReader(path);
}
catch(Exception ex) {
    // Uh oh something went wrong with opening the file stream
    MyOpeningFileStreamException newEx = new MyOpeningFileStreamException();
    newEx.InnerException = ex;
    throw(newEx);
}
    string line = reader.ReadLine();
    char character = line[30];

Конечно это имеет смысл только в том случае, если вас интересуют любые исключения, возникающие при открытии файлового потока (в качестве примера здесь) , кроме всех других исключений в приложении. На каком-то более высоком уровне приложения вы затем можете обработать свое MyOpeningFileStreamException так, как считаете нужным.

Из-за непроверенных исключений,

1
ответ дан 27 November 2019 в 21:42
поделиться

Я позволил себе немного изменить ваш код, чтобы продемонстрировать несколько важных моментов.

Конструкция using используется для открытия файла. Если возникнет исключение, вам нужно будет не забыть закрыть файл, даже если вы не поймаете исключение. Это можно сделать с помощью конструкции try {} catch () {} finally {} , но директива using для этого намного лучше. Это гарантирует, что когда область видимости блока using закончится, созданная внутри переменная будет удалена. Для файла это означает, что он будет закрыт.

Изучив документацию по конструктору StreamReader и методу ReadLine , вы можете увидеть, какие исключения вы можете ожидать. Затем вы можете поймать тех, кого сочтете подходящими. Обратите внимание, что документированный список исключений не всегда является полным.

// May throw FileNotFoundException, DirectoryNotFoundException,
// IOException and more.
try {
  using (StreamReader streamReader = new StreamReader(path)) {
    try {
      String line;
      // May throw IOException.
      while ((line = streamReader.ReadLine()) != null) {
        // May throw IndexOutOfRangeException.
        Char c = line[30];
        Console.WriteLine(c);
      }
    }
    catch (IOException ex) {
      Console.WriteLine("Error reading file: " + ex.Message);
    }
  }
}
catch (FileNotFoundException ex) {
  Console.WriteLine("File does not exists: " + ex.Message);
}
catch (DirectoryNotFoundException ex) {
  Console.WriteLine("Invalid path: " + ex.Message);
}
catch (IOException ex) {
  Console.WriteLine("Error reading file: " + ex.Message);
}
0
ответ дан 27 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: