Я пишу код обработки изображений и использую С# для низкоуровневых манипуляций с пикселями. Время от времени возникает исключение accessViolationException.
Есть несколько подходов к этой типичной проблеме, некоторые считают, что код должен быть написан надежно, чтобы не было исключений нарушения доступа, и, насколько я пытаюсь, приложение работает нормально, однако я хотел бы добавить отлов попытки, чтобы если что-то было чтобы это произошло, приложение не потерпело бы слишком ужасный сбой.
До сих пор я добавил пример кода, чтобы проверить его.
unsafe
{
byte* imageIn = (byte*)img.ImageData.ToPointer();
int inWidthStep = img.WidthStep;
int height = img.Height;
int width = img.Width;
imageIn[height * inWidthStep + width * 1000] = 100; // make it go wrong
}
Когда я пытаюсь поймать этот оператор, я все равно получаю исключение. Есть ли способ поймать исключения, сгенерированные в небезопасном блоке?
Изменить: как указано ниже, этот тип исключения больше не обрабатывается, если их проверка не включена явно путем добавления этого атрибута в функцию и добавления «using System.Runtime.ExceptionServices».
[HandleProcessCorruptedStateExceptions]
public void makeItCrash(IplImage img)
{
try
{
unsafe
{
byte* imageIn = (byte*)img.ImageData.ToPointer();
int inWidthStep = img.WidthStep;
int height = img.Height;
int width = img.Width;
imageIn[height * inWidthStep + width * 1000] = 100; // to make it crash
}
}
catch(AccessViolationException e)
{
// log the problem and get out
}
}