CLR обработает и Жалобу CLS и исключения жалобы не-CLS?

Это - двойное, разыменовывают.

int i = 3;
int* ptr_to_i = &i;
int** ptr_to_ptr_to_i = &ptr_to_i;

std::cout << **ptr_to_ptr_to_i << std::endl;

Печать 3.

8
задан user184805 7 October 2009 в 11:35
поделиться

3 ответа

  1. Да, вы можете генерировать исключения, не совместимые с CLS, в .NET Framework, если вы используете язык, который это позволяет, например C ++.
  2. Нет, вы не можете генерировать не- Совместимые с CLS исключения в C #.
  3. Нет, он перехватит все исключения, поскольку любое несовместимое с CLS исключение будет заключено в исключение RuntimeWrappedException , производное от Exception .
  4. ] Вы не генерируете исключение RuntimeWrappedException , это делает среда CLR. В MSDN есть подробное описание, которое я цитирую здесь:

    Некоторые языки, такие как C ++, позволяют создавать исключения любого управляемого типа. Другие языки, такие как Microsoft C # и Visual Basic, требуют, чтобы каждое генерируемое исключение было производным от класса Exception. Чтобы поддерживать совместимость между языками, среда CLR обертывает объекты, не являющиеся производными от Exception, в объект RuntimeWrappedException.

Если вы хотите обрабатывать исключения CLS и не-CLS по-разному, просто перехватите их в правильном порядке:

try {
    // some code
catch(RuntimeWrappedException ex) {
    // non-CLS exceptions
catch(Exception ex) {
    // CLS exceptions
}
13
ответ дан 5 December 2019 в 11:25
поделиться

Хотя компилятор C # позволяет разработчикам генерировать только объекты, производные от исключений, до C # версии 2.0, компилятор C # действительно позволял разработчикам перехватывать исключения, не совместимые с CLS. используя следующий код:

private void SomeMethod() { 
try { 
// Inside the try block is where you put code requiring 
// graceful recovery or common cleanup operations. 
}
catch (Exception e) { 
// Before C# 2.0, this block catches CLS-compliant exceptions only 
// In C# 2.0, this block catches CLS- & non-CLS- compliant exceptions 
throw; // Re-throws whatever got caught 
}
catch { 
// In all versions of C#, this block catches 
// CLS- & non-CLS- compliant exceptions 
throw; // Re-throws whatever got caught 
}
}
1
ответ дан 5 December 2019 в 11:25
поделиться

CLS позволяет это, но не все языки. Это можно сделать с помощью C ++ / CLI, но нельзя с C #, VB.NET.

Начиная с .Net Framework 2.0, все исключения, не относящиеся к CLS, заключены в исключение RuntimeWrappedException .

Поскольку RuntimeWrappedException является производным от Exception, catch (Exception) перехватит исключения, не относящиеся к CLS.

Из RuntimeWrappedException вы можете получить доступ к исходному исключению через свойство RuntimeWrappedException.WrappedException.

1
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

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