Перейти к содержимому

Что отсутствует в следующем коде

  • автор:

Ошибка компилятора CS0246

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

В следующих ситуациях возникает ошибка компилятора CS0246.

  • Допущена ошибка в имени типа или пространства имен? Без правильного имени компилятор не сможет найти определение типа или пространства имен. Это часто происходит из-за использования неверного регистра в имени типа. Например, Dataset ds; приводит к ошибке CS0246, поскольку буква s в Dataset должна быть прописной.
  • Если ошибка связана с именем пространства имен, добавили ли вы ссылку (References) на сборку, содержащую это пространство имен? Например, код может содержать директиву using Accessibility . Однако если ваш проект не ссылается на сборку Accessibility.dll, возникает ошибка CS0246. Дополнительные сведения см. в разделе Управление ссылками в проекте.
  • Если ошибка связана с именем типа, включили ли вы необходимую директиву using или полное имя типа? Рассмотрим следующее объявление: DataSet ds . Для использования типа DataSet необходимо следующее. Во-первых, нужна ссылка на сборку, содержащую определение типа DataSet . Во-вторых, требуется директива using для пространства имен, где находится DataSet . Например, поскольку DataSet находится в пространстве имен System.Data , в начале кода требуется указать следующую директиву: using System.Data . Директива using не является обязательной. Однако если эта директива не используется, вы должны указать полное имя типа DataSet при ссылке на него. Полное имя означает, что при каждой ссылке на тип в коде вы должны указывать этот тип вместе с его пространством имен. Если в предыдущем примере не указывать директиву using , то необходимо писать System.Data.DataSet ds вместо ds для объявления DataSet ds .
  • Вы использовали переменную или другой элемент языка там, где ожидался тип? Например, если в операторе is вы используете объект Type вместо фактического типа, возникнет ошибка CS0246.
  • Возможно, вы ссылаетесь на сборку, которая создана на платформе более поздней версии, чем версия целевой платформы программы? Или вы ссылались на проект, нацеленный на платформу более поздней версии, чем у целевой платформы программы? Например, возможно, вы работаете над проектом с целевой платформой .NET Framework 4.6.1, но используете тип из проекта с целевой платформой .NET Framework 4.7.1. В этом случае возникает ошибка CS0246.
  • Включены ли все упоминаемые проекты в выбранную конфигурацию сборки и платформу? Используйте Configuration Manager Visual Studio, чтобы убедиться, что все указанные проекты помечены для сборки с выбранной конфигурацией и платформой.
  • Вы использовали директиву using псевдоним без указания полного имени типа? Директива » using псевдоним» не использует директивы using в файле исходного кода для разрешения типов. В следующем примере возникает ошибка CS0246, поскольку не указано полное имя типа List . Директива using для System.Collections.Generic не предотвращает эту ошибку.

using System.Collections.Generic; // The following declaration generates CS0246. using myAliasName = List; // To avoid the error, fully qualify List. using myAliasName2 = System.Collections.Generic.List; 

В следующем примере возникает ошибка CS0246 из-за отсутствия необходимой директивы using .

// CS0246.cs //using System.Diagnostics; public class MyClass < // The following line causes CS0246. To fix the error, uncomment // the using directive for the namespace for this attribute, // System.Diagnostics. [Conditional("A")] public void Test() < >public static void Main() < >> 

В следующем примере возникает ошибка CS0246, поскольку там, где ожидался фактический тип, использовался объект типа Type .

// CS0246b.cs using System; class ExampleClass < public bool supports(object o, Type t) < // The following line causes CS0246. You must use an // actual type, such as ExampleClass, String, or Type. if (o is t) < return true; >return false; > > class Program < public static void Main() < ExampleClass myC = new ExampleClass(); myC.supports(myC, myC.GetType()); >> 

Обработка ошибок с помощью Python

Ошибки случаются. Написание скриптов, которое предполагает наличие и обработку ошибок, сохраняет массу времени и ваших сил. Когда инструмент выводит сообщение об ошибке, ArcPy генерирует системную ошибку или исключение. В Python вы можете обеспечить различные структуры и методы для обработки исключений. Конечно, скрипт может не выполниться по причинам, не связанным с инструментом геообработки. Их также следует обнаружить и решить. В следующих разделах предлагается несколько способов, которые ознакомят вас с основными принципами обработки исключений в Python .

Когда инструмент записывает сообщение об ошибке, ArcPy создает исключение arcpy.ExecuteError . Python позволяет написать модуль, который будет выполняться автоматически при возникновении системной ошибки. С помощью этого модуля для обработки ошибок вы сможете получать сообщения об ошибках от ArcPy и реагировать на них. Если скрипт не имеет модуля для обработки ошибок, он завершает выполнение немедленно, что уменьшает его надежность. Модуль обработки ошибок можно использовать для управления ошибками и повышения надежности скриптов.

Сообщения об ошибках в инструментах геообработки обычно имеют шестизначный код. Эти коды-идентификаторы занесены в документы, содержащие дополнительные сведения об их причинах и необходимых действиях.

Выражение try-except

Чтобы охватить всю программу целиком или только отдельные фрагменты кода для обнаружения и определения ошибок могут использоваться выражения try-except . Если в выражении try возникнет ошибка, будет создано исключение, и код будет выполнен в соответствии с выражением except. Использование выражения except является наиболее простой формой обработки ошибок.

В следующем коде Буфер не работает, потому что не был указан обязательный аргумент buffer_distance_or_field . Чтобы найти ошибку, используется выражение except , которое извлекает и выводит сообщение об ошибке, сгенерированное Буфером . Обратите внимание, что блок except выполняется только в случае, если Буфер возвращает ошибку.

import arcpy import sys try: # Execute the Buffer tool arcpy.Buffer_analysis("c:/transport/roads.shp", "c:/transport/roads_buffer.shp") except Exception: e = sys.exc_info()[1] print(e.args[0]) # If using this code within a script tool, AddError can be used to return messages # back to a script tool. If not, AddError will have no effect. arcpy.AddError(e.args[0])

Выражение try содержит необязательное условие finally , которое можно использовать для задач, которые должны выполняться всегда, независимо от того, возникает исключение или нет. В следующем примере ArcGIS 3D Analyst extension регистрируется в соответствии с условием finally , которое гарантирует, что этот дополнительный модуль всегда будет регистрироваться.

class LicenseError(Exception): pass import arcpy try: if arcpy.CheckExtension("3D") == "Available": arcpy.CheckOutExtension("3D") else: # Raise a custom exception raise LicenseError arcpy.env.workspace = "D:/GrosMorne" arcpy.HillShade_3d("WesternBrook", "westbrook_hill", 300) arcpy.Aspect_3d("WesternBrook", "westbrook_aspect") except LicenseError: print "3D Analyst license is unavailable" except arcpy.ExecuteError: print(arcpy.GetMessages(2)) finally: # Check in the 3D Analyst extension arcpy.CheckInExtension("3D")

Выражение raise

Предыдущий пример иллюстрирует ошибку в исключении, которое возникло в коде В некоторых случаях может потребоваться создать пользовательские исключения. Для этой цели может использоваться выражение raise . В следующем коде выражение raise используется, если входной класс объектов определился как не содержащий объектов. Это не обязательно ошибка, но условие, при котором код может быть использован.

class NoFeatures(Exception): pass import arcpy import os import sys arcpy.env.overwriteOutput = True fc = arcpy.GetParameterAsText(0) try: # Check that the input has features result = arcpy.GetCount_management(fc) if int(result[0]) > 0: arcpy.FeatureToPolygon_management( fc, os.path.join(os.path.dirname(fc), 'out_poly.shp')) else: # Raise custom exception raise NoFeatures(result) except NoFeatures: # The input has no features print('<> has no features'.format(fc)) except: # By default any other errors will be caught here e = sys.exc_info()[1] print(e.args[0])

Класс ExecuteError

Когда инструмент геообработки выходит из строя, он создает класс исключений arcpy.ExecuteError , что означает, что вы можете разделить ошибки на различные группы, ошибки геообработки (те, которые создают исключение arcpy.ExecuteError ) и другие типы исключений. Затем можно обрабатывать эти ошибки по разному, как показано в следующем коде:

import arcpy import sys try: result = arcpy.GetCount_management("C:/invalid.shp") # Return geoprocessing specific errors except arcpy.ExecuteError: arcpy.AddError(arcpy.GetMessages(2)) # Return any other type of error except: # By default any other errors will be caught here e = sys.exc_info()[1] print(e.args[0])

traceback

В больших и более сложных скриптах бывает сложно точное определить место возникновения ошибки. Для определения точного местоположения и причины ошибки, а также для более точного определения причины ошибки и экономии ценного времени на отладку можно использовать модули Python , sys и traceback совместно.

# Import the required modules # import arcpy import sys import traceback arcpy.env.workspace = "C:/Data/myData.gdb" try: arcpy.CreateSpatialReference_management() #-------------------------- # Your code goes here # # See the table below for examples #-------------------------- except arcpy.ExecuteError: # Get the tool error messages msgs = arcpy.GetMessages(2) # Return tool error messages for use with a script tool arcpy.AddError(msgs) # Print tool error messages for use in Python print(msgs) except: # Get the traceback object tb = sys.exc_info()[2] tbinfo = traceback.format_tb(tb)[0] # Concatenate information together concerning the error into a message string pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1]) msgs = "ArcPy ERRORS:\n" + arcpy.GetMessages(2) + "\n" # Return Python error messages for use in script tool or Python window arcpy.AddError(pymsg) arcpy.AddError(msgs) # Print Python error messages for use in Python / Python window print(pymsg) print(msgs)

Если был использован приведенный выше код, и произошла ошибка инструмента геообработки, такая как недопустимые входные данные, это вызовет arcpy.ExecuteError , и будет использоваться первое выражение except . Это выражение выведет сообщение об ошибке с помощью функции GetMessages . Если использовался тот же код, но возникла ошибка другого типа, будет использовано второе выражение except . Вместо печати сообщений о геообработке, будет получен объект traceback и выведены соответствующие сообщения о системных ошибках.

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

PYTHON ERRORS: Traceback info: File "c:\temp\errortest.py", line 10, in arcpy.GetCount_management("") Error Info: Failed to execute. Parameters are not valid. ERROR 000735: Input Rows: value is required Failed to execute (GetCount). ArcPy ERRORS: Failed to execute. Parameters are not valid. ERROR 000735: Input Rows: value is required Failed to execute (GetCount).
PYTHON ERRORS: Traceback info: File "c:\temp\errortest.py", line 10, in x = "a" + 1 Error Info: cannot concatenate 'str' and 'int' objects

float(«a text string»)

PYTHON ERRORS: Traceback info: File "c:\temp\errortest.py", line 10, in float("a text string") Error Info: invalid literal for float(): a text string

Получение сообщений об ошибках от объекта Result

Несколько слов об объекте Result , который показан ниже:

result = arcpy.GetCount_management("c:/data/rivers.shp")

Если запрос в GetCount_management вызывает исключение, объект Result не создается. Это означает, что вы не можете получать сообщения об ошибках от объекта Result .

import arcpy try: result = arcpy.GetCount_management("c:/data/rivers.shp") # Return Geoprocessing specific errors # (this method is incorrect!) except arcpy.ExecuteError: arcpy.AddError(result.getMessages(2))

Указанный выше код не работает, и появляется сообщение name ‘result’ is not defined . Причина в том, что объект Result невозможно было создать из-за ошибки инструмента. Поскольку объект Result не создан, возникает ошибка Python при попытке использования метода getMessages .

Примечание:

Объект Result , создаваемый путем запроса в сервис геообработки на ArcGIS Server , создается даже при ошибке инструмента. Создание объекта Result не удается только тогда, когда инструмент запускается локально и вызывает ошибку. Более подробную информацию об использовании объекта result смотрите в разделе Использование инструментов в Python .

В этом разделе
  1. Выражение try-except
  2. Выражение raise
  3. Класс ExecuteError
  4. traceback
  5. Получение сообщений об ошибках от объекта Result

Найдите ошибки в следующем коде

Обложка поста Найдите ошибки в следующем коде

Первая заключается в том, что используется тип unsigned int , который работает только со значениями, большими или равными нулю. Поэтому условие цикла for всегда будет истинно, и цикл будет выполняться бесконечно.

Корректный код, выводящий значения всех чисел от 100 до 1, должен использовать условие i > 0 . Если нам на самом деле нужно вывести нулевое значение, то следует добавить дополнительный оператор printf после цикла for .

unsigned int i; for (i = 100; i > 0; --i) printf("%d\n", i); printf("%d\n", i); 

Вторая ошибка — вместо %d следует использовать %u , поскольку мы выводим целые значения без знака.

unsigned int i; for (i = 100; i > 0; --i) printf("%u\n", i); 

Теперь этот код правильно выведет список чисел от 100 до 1, в убывающем порядке.

Разбор взят из книги Гейл Л. Макдауэлл «Cracking the Coding Interview» (есть в переводе).

Решение модуля 6.1 из курса «Поколение python» stepik

Авторское решение модуля 6.1 курса «Поколение Python: курс для начинающих» с сайта stepik.org от авторов zazlo.ru.

В ходе этого урока обучающийся должен узнать как пользоваться функциями int(), min(), max(), float(), abs() и понять в целом принцип работы с различными числовыми значениями путем решения соответствующих задач.

Решение модуля 6.1 из курса

Площадь треугольника

Напишите программу, которая считывает длины двух катетов в прямоугольном треугольнике и выводит его площадь.

модуль 6.1 поколение python stepik

a = float(input()) # получаем число с плавающей запятой b = float(input()) # получаем число с плавающей запятой # Вычисляем площадь треугольника по формуле (основание * высота) / 2, используя введенные значения 'a' и 'b', # и выводит результат (площадь треугольника) на экран. print((a * b) / 2)

Решение модуля 6.1 из курса

Два автомобиля

Два автомобиля едут навстречу друг другу с постоянными скоростями V1​ и V2​ км/ч. Определите, через какое время автомобили встретятся, если расстояние между ними равно S км.

Иллюстрация задания

s = float(input()) # получаем число с плавающей запятой v1 = float(input()) # получаем число с плавающей запятой v2 = float(input()) # получаем число с плавающей запятой # Вычисляем время, за которое два объекта с постоянными скоростями 'v1' и 'v2' проедут расстояние 's', # используя формулу времени = расстояние / (скорость1 + скорость2), и выводит результат (время) на экран. print(s / (v1 + v2))

Решение модуля 6.1 из курса

Обратное число

Напишите программу, которая считывает с клавиатуры одно число и выводит обратное ему. Если при этом введённое с клавиатуры число – ноль, то вывести «Обратного числа не существует» (без кавычек).

Поколение python stepik 6.1

n = float(input()) # получаем число с плавающей запятой # Проверяем, равно ли введенное число 'n' нулю. Если да, выводит сообщение "Обратного числа не существует", # иначе вычисляет обратное число (1 / n) и выводит его на экран. if n == 0: print('Обратного числа не существует') else: print(1 / n)

Решение модуля 6.1 из курса

451 градус по Фаренгейту

У известного американского писателя Рэя Бредбери есть роман «451 градус по Фаренгейту». Напишите программу, которая определяет, какой температуре по шкале Цельсия соответствует указанное значение по шкале Фаренгейта.

Используйте формулу для перевода:

F = float(input()) # получаем число с плавающей запятой # Вычисляем эквивалентную температуру в градусах Цельсия, используя формулу перевода из шкалы Фаренгейта в шкалу Цельсия и выводит результат на экран. print(5 / 9 * (F - 32))

Решение модуля 6.1 из курса

Dog age

На вход программе подается число nn – количество собачьих лет. Напишите программу, которая вычисляет возраст собаки в человеческих годах.

age = int(input()) # получаем число полных лет # Проверяем, является ли введенный возраст 'age' меньше или равным 2. Если да, то вычисляет и выводит # возраст в человеческих годах в сравнении с возрастом собаки, используя формулу: age * 10.5. if age 

Решение модуля 6.1 из курса

Первая цифра после точки

Дано положительное действительное число. Выведите его первую цифру после десятичной точки.

x = float(input()) # получаем число с плавающей запятой # x умножаем на 10, берет остаток от деления на 10 (это десятичная часть числа), # и выводит результат (десятичную часть) на экран. print(int(x * 10) % 10)

Решение модуля 6.1 из курса

Дробная часть

Дано положительное действительное число. Выведите его дробную часть.

a = float(input()) # получаем число с плавающей запятой # из числа 'a' вычитаем число 'a' переведеное в целое(оставляя только дробную часть), # и выводит результат (дробную часть числа) на экран. print(a - int(a))

Вопрос: Какое число будет выведено на экран в результате выполнения следующего кода?

num = max(1, 3, -5, 7) + min(-3, 6, -8, -1) + abs(-17) print(num)

Ответ: 16

Решение модуля 6.1 из курса

Наибольшее и наименьшее

Напишите программу, которая находит наименьшее и наибольшее из пяти чисел.

# получаем пять целых чисел и присваивает каждое из них переменным 'a', 'b', 'c', 'd' и 'e'. a, b, c, d, e = int(input()), int(input()), int(input()), int(input()), int(input()) # Выводим на экран строку с сообщением о наименьшем числе, # найденном среди введенных значений, используя функцию min(). print('Наименьшее число =', min(a, b, c, d, e)) # Выводим на экран строку с сообщением о наибольшем числе, # найденном среди введенных значений, используя функцию max(). print('Наибольшее число =', max (a, b, c, d, e))

Решение модуля 6.1 из курса

Сортировка трёх ?️

Напишите программу, которая упорядочивает три числа от большего к меньшему.

# получаем три целых чисел и присваивает каждое из них переменным 'a', 'b' и 'c'. a, b, c = int(input()), int(input()), int(input()) # Находим и выводит на экран наибольшее из введенных чисел, используя функцию max(). print(max(a, b, c)) # Вычисляем и выводит на экран разность суммы трех введенных чисел и двух из них (наименьшего и наибольшего), # чтобы получить среднее число, которое выводим на экран. print(a + b + c - min(a, b, c) - max(a, b, c)) # Находим и выводит на экран наименьшее из введенных чисел, используя функцию min(). print(min(a, b, c))

Решение модуля 6.1 из курса

Интересное число

Назовем число интересным, если в нем разность максимальной и минимальной цифры равняется средней по величине цифре. Напишите программу, которая определяет интересное число или нет. Если число интересное, следует вывести – «Число интересное» иначе «Число неинтересное».

x = int(input()) # получаем целое число # Вычисляем последнюю цифру числа 'x' (единицы), используя операцию взятия остатка от деления на 10, # и сохраняет её в переменной 'a'. a = x % 10 # Вычисляем предпоследнюю цифру числа 'x' (десятки), используя операцию целочисленного деления на 10 и # затем возьмем остаток от деления результата на 10, и сохраняем её в переменной 'b'. b = x // 10 % 10 # Вычисляем первую цифру числа 'x' (сотни), используя операцию целочисленного деления на 100, # и сохраняем её в переменной 'c'. c = x // 100 # Проверяем, является ли сумма цифр числа 'x' (a + b + c) равной удвоенному максимальному значению из a, b и c. # Если это условие выполняется, то выводим сообщение "Число интересное", иначе выводим "Число неинтересное". if a + b + c == 2 * max(a, b, c): print("Число интересное") # Выводим сообщение, если условие выполняется else: print("Число неинтересное") # Выводим сообщение, если условие не выполняется

Решение модуля 6.1 из курса

Абсолютная сумма

Даны пять чисел a1, a2, a3, a4, a5​. Напишите программу, которая вычисляет сумму их модулей |a1| + |a2| +|a3| +|a4| + |a5|∣.

# Получаем 5 чисел с плавающей запятой, вычисляет его абсолютное значение # С помощью функции abs() и сохраняет результат в переменной 'a','b'.'c','d','e'. a = abs(float(input())) b = abs(float(input())) c = abs(float(input())) d = abs(float(input())) e = abs(float(input())) # Вычисляем сумму абсолютных значений введенных чисел 'a', 'b', 'c', 'd' и 'e', и выводим результат на экран. print(a + b + c + d + e)

Решение модуля 6.1 из курса

Манхэттенское расстояние

Прогуливаясь по Манхэттену, вы не можете попасть из точки А в точку Б по кратчайшему пути. Если только вы не умеете проходить сквозь стены, вам обязательно придется идти вдоль его параллельно-перпендикулярных улиц.

На плоскости манхэттенское расстояние между двумя точками (p1​;p2​) и (q1​;q2​) определяется так ∣p1​−q1​∣+∣p2​−q2​∣.

Напишите программу определяющую манхэттенское расстояние между двумя точками, координаты которых заданы.

решение модуля 6.1 поколение python stepik

# Получаем 4 целых числа и сохраняем в переменную' p1 = int(input()) p2 = int(input()) q1 = int(input()) q2 = int(input()) # Вычисляем сумму модулей разностей соответствующих координат 'p1' и 'q1' (по x) и 'p2' и 'q2' (по y) # и выводим результат на экран. print(abs(p1 - q1) + abs(p2 - q2))

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Добавить комментарий

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