Lagi

Mulai Mengedit Kembalikan kesalahan yang tidak ditentukan (Pengecualian dari HRESULT: 0x80004005 (E_FAIL))

Mulai Mengedit Kembalikan kesalahan yang tidak ditentukan (Pengecualian dari HRESULT: 0x80004005 (E_FAIL))


Saya menggunakan metode IEngineEditor.StartEditing untuk memulai sesi edit di SDE Workspace. Ruang kerja saya memiliki nilai yang tepat karena saya tidak punya masalah untuk mendapatkan kelas fitur yang menggunakannya. Saya tidak yakin di mana saya melakukan kesalahan, atau apa yang menyebabkan kesalahan ini. Tolong bantu.

IPropertySet propertySet = new PropertySetClass(); propertySet.SetProperty("SERVER", Server Saya); propertySet.SetProperty("INSTANCE", MyInstance); propertySet.SetProperty("DATABASE", MyDatabase); propertySet.SetProperty("USER", NamaUser Saya); propertySet.SetProperty("PASSWORD", MyPassword); propertySet.SetProperty("VERSI", Versi Saya); Ketik factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory"); IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType); Ruang kerja IWorkspace = workspaceFactory.Open(propertySet, 0); IFeatureWorkspace pFeatureWorkspace = workSpace sebagai IFeatureWorkspace; IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass("MyFeatureClassName"); //Saya bisa mendapatkan kelas fitur ini. Ini untuk digunakan nanti IMap pMap = mapControl.Map; engineEditor.StartEditing(ruang kerja, pMap);

Saya belum memiliki "50 reputasi" untuk berkomentar, jadi saya harus berkomentar seperti ini:

Apa produk berlisensi ArcGIS yang Anda jalankan? ArcGIS Basic (sebelumnya ArcView) tidak dapat mengedit ruang kerja SDE jadi jika itu yang Anda gunakan, itu bisa menjadi masalah Anda. Jika Anda menggunakan ArcEngine, verifikasi produk berlisensi yang Anda gunakan untuk menginisialisasi aplikasi Anda.


Contoh berikut menunjukkan blok tangkap yang didefinisikan untuk menangani kesalahan ArithmeticException. Blok tangkapan ini juga menangkap kesalahan DivideByZeroException, karena DivideByZeroException berasal dari ArithmeticException dan tidak ada blok tangkapan yang didefinisikan secara eksplisit untuk kesalahan DivideByZeroException.

Kelas ini adalah kelas dasar untuk semua pengecualian. Ketika terjadi kesalahan, baik sistem atau aplikasi yang sedang menjalankan melaporkannya dengan melemparkan pengecualian yang berisi informasi tentang kesalahan tersebut. Setelah pengecualian dilemparkan, itu ditangani oleh aplikasi atau oleh penangan pengecualian default.

Kesalahan dan pengecualian

Kesalahan run-time dapat terjadi karena berbagai alasan. Namun, tidak semua kesalahan harus ditangani sebagai pengecualian dalam kode Anda. Berikut adalah beberapa kategori kesalahan yang dapat terjadi saat run time dan cara yang tepat untuk menanggapinya.

Kesalahan penggunaan. Kesalahan penggunaan mewakili kesalahan dalam logika program yang dapat menghasilkan pengecualian. Namun, kesalahan harus diatasi tidak melalui penanganan pengecualian tetapi dengan memodifikasi kode yang salah. Misalnya, penggantian metode Object.Equals(Object) dalam contoh berikut mengasumsikan bahwa argumen obj harus selalu non-null.

Pengecualian NullReferenceException yang dihasilkan ketika obj adalah null dapat dihilangkan dengan memodifikasi kode sumber untuk menguji null secara eksplisit sebelum memanggil penggantian Object.Equals dan kemudian mengkompilasi ulang. Contoh berikut berisi kode sumber yang dikoreksi yang menangani argumen null.

Alih-alih menggunakan penanganan pengecualian untuk kesalahan penggunaan, Anda dapat menggunakan metode Debug.Assert untuk mengidentifikasi kesalahan penggunaan di build debug, dan metode Trace.Assert untuk mengidentifikasi kesalahan penggunaan di build debug dan rilis. Untuk informasi selengkapnya, lihat Pernyataan di Kode Terkelola.

Kesalahan program. Kesalahan program adalah kesalahan run-time yang tidak dapat dihindari dengan menulis kode bebas bug.

Dalam beberapa kasus, kesalahan program mungkin mencerminkan kondisi kesalahan yang diharapkan atau rutin. Dalam hal ini, Anda mungkin ingin menghindari penggunaan penanganan pengecualian untuk menangani kesalahan program dan sebagai gantinya mencoba kembali operasi tersebut. Misalnya, jika pengguna diharapkan untuk memasukkan tanggal dalam format tertentu, Anda dapat mengurai string tanggal dengan memanggil metode DateTime.TryParseExact, yang mengembalikan nilai Boolean yang menunjukkan apakah operasi penguraian berhasil, alih-alih menggunakan DateTime. Metode ParseExact, yang menampilkan pengecualian FormatException jika string tanggal tidak dapat dikonversi ke nilai DateTime. Demikian pula, jika pengguna mencoba membuka file yang tidak ada, Anda dapat memanggil metode File.Exists terlebih dahulu untuk memeriksa apakah file tersebut ada dan, jika tidak, meminta pengguna apakah dia ingin membuatnya.

Dalam kasus lain, kesalahan program mencerminkan kondisi kesalahan tak terduga yang dapat ditangani dalam kode Anda. Misalnya, meskipun Anda telah memeriksa untuk memastikan bahwa ada file, file tersebut mungkin dihapus sebelum Anda dapat membukanya, atau mungkin rusak. Dalam hal ini, mencoba membuka file dengan membuat instance objek StreamReader atau memanggil metode Open dapat memunculkan pengecualian FileNotFoundException. Dalam kasus ini, Anda harus menggunakan penanganan pengecualian untuk memulihkan dari kesalahan.

Kegagalan sistem. Kegagalan sistem adalah kesalahan run-time yang tidak dapat ditangani secara terprogram dengan cara yang berarti. Misalnya, metode apa pun dapat mengeluarkan pengecualian OutOfMemoryException jika runtime bahasa umum tidak dapat mengalokasikan memori tambahan. Biasanya, kegagalan sistem tidak ditangani dengan menggunakan penanganan pengecualian. Sebagai gantinya, Anda mungkin dapat menggunakan peristiwa seperti AppDomain.UnhandledException dan memanggil metode Environment.FailFast untuk mencatat informasi pengecualian dan memberi tahu pengguna tentang kegagalan sebelum aplikasi dihentikan.

Coba/tangkap blok

Runtime bahasa umum menyediakan model penanganan pengecualian yang didasarkan pada representasi pengecualian sebagai objek, dan pemisahan kode program dan kode penanganan pengecualian menjadi blok coba dan blok tangkap. Mungkin ada satu atau lebih blok tangkapan, masing-masing dirancang untuk menangani jenis pengecualian tertentu, atau satu blok dirancang untuk menangkap pengecualian yang lebih spesifik daripada blok lain.

Jika aplikasi menangani pengecualian yang terjadi selama eksekusi blok kode aplikasi, kode tersebut harus ditempatkan dalam pernyataan try dan disebut blok try. Kode aplikasi yang menangani eksepsi yang dilempar oleh blok try ditempatkan di dalam pernyataan catch dan disebut blok catch. Nol atau lebih blok tangkap dikaitkan dengan blok coba, dan setiap blok tangkap menyertakan filter tipe yang menentukan tipe pengecualian yang ditanganinya.

Ketika pengecualian terjadi di blok coba, sistem mencari blok tangkapan terkait dalam urutan kemunculannya dalam kode aplikasi, hingga menemukan blok tangkap yang menangani pengecualian. Blok catch menangani pengecualian tipe T jika filter tipe blok catch menentukan T atau tipe apa pun yang berasal dari T. Sistem berhenti mencari setelah menemukan blok tangkapan pertama yang menangani pengecualian. Untuk alasan ini, dalam kode aplikasi, blok tangkap yang menangani tipe harus ditentukan sebelum blok tangkap yang menangani tipe dasarnya, seperti yang ditunjukkan dalam contoh berikut bagian ini. Blok tangkap yang menangani System.Exception ditentukan terakhir.

Jika tidak ada blok tangkap yang terkait dengan blok coba saat ini yang menangani pengecualian, dan blok coba saat ini bersarang di dalam blok coba lain dalam panggilan saat ini, blok tangkap yang terkait dengan blok coba terlampir berikutnya akan dicari. Jika tidak ada blok tangkapan untuk pengecualian yang ditemukan, sistem akan mencari level bersarang sebelumnya dalam panggilan saat ini. Jika tidak ada blok tangkap untuk pengecualian yang ditemukan dalam panggilan saat ini, pengecualian dilewatkan ke tumpukan panggilan, dan bingkai tumpukan sebelumnya akan mencari blok tangkap yang menangani pengecualian. Pencarian tumpukan panggilan berlanjut hingga pengecualian ditangani atau hingga tidak ada lagi bingkai pada tumpukan panggilan. Jika bagian atas tumpukan panggilan tercapai tanpa menemukan blok tangkap yang menangani pengecualian, penangan pengecualian default menanganinya dan aplikasi dihentikan.

Fitur jenis pengecualian

Jenis pengecualian mendukung fitur berikut:

Teks yang dapat dibaca manusia yang menjelaskan kesalahan. Ketika pengecualian terjadi, runtime membuat pesan teks tersedia untuk memberi tahu pengguna tentang sifat kesalahan dan menyarankan tindakan untuk menyelesaikan masalah. Pesan teks ini disimpan di properti Pesan dari objek pengecualian. Selama pembuatan objek pengecualian, Anda dapat meneruskan string teks ke konstruktor untuk menjelaskan detail pengecualian tersebut. Jika tidak ada argumen pesan kesalahan yang diberikan ke konstruktor, pesan kesalahan default akan digunakan. Untuk informasi selengkapnya, lihat properti Pesan.

Status tumpukan panggilan saat pengecualian dilemparkan. Properti StackTrace membawa pelacakan tumpukan yang dapat digunakan untuk menentukan di mana kesalahan terjadi dalam kode. Jejak tumpukan mencantumkan semua metode yang dipanggil dan nomor baris dalam file sumber tempat panggilan dilakukan.

Properti kelas pengecualian

Kelas Pengecualian mencakup sejumlah properti yang membantu mengidentifikasi lokasi kode, jenis, file bantuan, dan alasan pengecualian: StackTrace, InnerException, Pesan, HelpLink, HResult, Sumber, TargetSite, dan Data.

Ketika ada hubungan kausal antara dua atau lebih pengecualian, properti InnerException mempertahankan informasi ini. Pengecualian luar dilemparkan sebagai respons terhadap pengecualian dalam ini. Kode yang menangani pengecualian luar dapat menggunakan informasi dari pengecualian dalam sebelumnya untuk menangani kesalahan dengan lebih tepat. Informasi tambahan tentang pengecualian dapat disimpan sebagai kumpulan pasangan kunci/nilai di properti Data.

String pesan galat yang diteruskan ke konstruktor selama pembuatan objek pengecualian harus dilokalkan dan dapat diberikan dari file sumber daya dengan menggunakan kelas ResourceManager. Untuk informasi selengkapnya tentang sumber daya yang dilokalkan, lihat topik Membuat Rakitan Satelit dan Pengemasan dan Penerapan Sumber Daya.

Untuk memberikan informasi lengkap kepada pengguna tentang mengapa pengecualian terjadi, properti HelpLink dapat menyimpan URL (atau URN) ke file bantuan.

Kelas Pengecualian menggunakan HRESULT COR_E_EXCEPTION, yang memiliki nilai 0x80131500.

Untuk daftar nilai properti awal untuk instance kelas Pengecualian, lihat konstruktor Pengecualian.

Pertimbangan kinerja

Melempar atau menangani pengecualian menghabiskan banyak sumber daya sistem dan waktu eksekusi. Lempar pengecualian hanya untuk menangani kondisi yang benar-benar luar biasa, bukan untuk menangani peristiwa yang dapat diprediksi atau kontrol aliran. Misalnya, dalam beberapa kasus, seperti saat Anda mengembangkan pustaka kelas, masuk akal untuk melemparkan pengecualian jika argumen metode tidak valid, karena Anda mengharapkan metode Anda dipanggil dengan parameter yang valid. Argumen metode yang tidak valid, jika bukan hasil dari kesalahan penggunaan, berarti telah terjadi sesuatu yang luar biasa. Sebaliknya, jangan berikan pengecualian jika input pengguna tidak valid, karena Anda dapat mengharapkan pengguna sesekali memasukkan data yang tidak valid. Sebagai gantinya, berikan mekanisme coba lagi sehingga pengguna dapat memasukkan input yang valid. Anda juga tidak boleh menggunakan pengecualian untuk menangani kesalahan penggunaan. Sebaliknya, gunakan pernyataan untuk mengidentifikasi dan memperbaiki kesalahan penggunaan.

Selain itu, jangan melempar pengecualian saat kode pengembalian cukup, jangan mengubah kode pengembalian menjadi pengecualian dan jangan secara rutin menangkap pengecualian, abaikan, lalu lanjutkan pemrosesan.

Melemparkan kembali pengecualian

Dalam banyak kasus, penangan pengecualian hanya ingin meneruskan pengecualian ke pemanggil. Ini paling sering terjadi di:

Pustaka kelas yang pada gilirannya membungkus panggilan ke metode di pustaka kelas .NET Framework atau pustaka kelas lainnya.

Aplikasi atau pustaka yang mengalami pengecualian fatal. Pengendali pengecualian dapat mencatat pengecualian dan kemudian melemparkan kembali pengecualian tersebut.

Cara yang disarankan untuk melempar kembali pengecualian adalah dengan menggunakan pernyataan throw dalam C# dan pernyataan Throw dalam Visual Basic tanpa menyertakan ekspresi. Ini memastikan bahwa semua informasi tumpukan panggilan dipertahankan saat pengecualian disebarkan ke pemanggil. Contoh berikut menggambarkan hal ini. Metode ekstensi string, FindOccurrences , membungkus satu atau beberapa panggilan ke String.IndexOf(String, Int32) tanpa memvalidasi argumennya terlebih dahulu.

Seorang penelepon kemudian memanggil FindOccurrences dua kali. Dalam panggilan kedua ke FindOccurrences , pemanggil melewatkan null sebagai string pencarian, yang menyebabkan metode String.IndexOf(String, Int32) melempar pengecualian ArgumentNullException. Pengecualian ini ditangani oleh metode FindOccurrences dan diteruskan kembali ke pemanggil. Karena pernyataan throw digunakan tanpa ekspresi, output dari contoh menunjukkan bahwa tumpukan panggilan dipertahankan.

Sebaliknya, jika pengecualian dilempar kembali dengan menggunakan

pernyataan, tumpukan panggilan lengkap tidak dipertahankan, dan contoh akan menghasilkan output berikut:

Alternatif yang sedikit lebih rumit adalah dengan melemparkan pengecualian baru, dan untuk mempertahankan informasi tumpukan panggilan pengecualian asli dalam pengecualian dalam. Pemanggil kemudian dapat menggunakan properti InnerException pengecualian baru untuk mengambil bingkai tumpukan dan informasi lain tentang pengecualian asli. Dalam hal ini, pernyataan throw adalah:

Kode pengguna yang menangani pengecualian harus mengetahui bahwa properti InnerException berisi informasi tentang pengecualian asli, seperti yang diilustrasikan oleh pengendali pengecualian berikut.

Memilih pengecualian standar

Saat Anda harus mengeluarkan pengecualian, Anda sering dapat menggunakan jenis pengecualian yang ada di .NET Framework alih-alih menerapkan pengecualian khusus. Anda harus menggunakan tipe pengecualian standar dalam dua kondisi berikut:

Anda melempar pengecualian yang disebabkan oleh kesalahan penggunaan (yaitu, kesalahan dalam logika program yang dibuat oleh pengembang yang memanggil metode Anda). Biasanya, Anda akan melempar pengecualian seperti ArgumentException, ArgumentNullException, InvalidOperationException, atau NotSupportedException. String yang Anda berikan ke konstruktor objek pengecualian saat membuat instance objek pengecualian harus menjelaskan kesalahan sehingga pengembang dapat memperbaikinya. Untuk informasi selengkapnya, lihat properti Pesan.

Anda menangani kesalahan yang dapat dikomunikasikan ke pemanggil dengan pengecualian .NET Framework yang ada. Anda harus membuang pengecualian yang paling mungkin diturunkan. Misalnya, jika suatu metode memerlukan argumen untuk menjadi anggota yang valid dari tipe enumerasi, Anda harus melempar InvalidEnumArgumentException (kelas paling turunan) daripada ArgumentException.

Tabel berikut mencantumkan jenis pengecualian umum dan kondisi di mana Anda akan membuangnya.

Pengecualian Kondisi
Pengecualian Argumen Argumen non-null yang diteruskan ke metode tidak valid.
ArgumenNullException Argumen yang diteruskan ke metode adalah null .
ArgumentOutOfRangeException Argumen berada di luar rentang nilai yang valid.
DirectoryNotFoundException Bagian dari jalur direktori tidak valid.
DivideByZeroException Penyebut dalam operasi pembagian bilangan bulat atau desimal adalah nol.
Pengecualian DriveNotFound Drive tidak tersedia atau tidak ada.
FileNotFoundException Sebuah file tidak ada.
Pengecualian Format Nilai tidak dalam format yang sesuai untuk dikonversi dari string dengan metode konversi seperti Parse .
IndexOutOfRangeException Indeks berada di luar batas array atau koleksi.
Pengecualian Operasi Tidak Valid Panggilan metode tidak valid dalam status objek saat ini.
Pengecualian KeyNotFound Kunci yang ditentukan untuk mengakses anggota dalam koleksi tidak dapat ditemukan.
Tidak DiimplementasikanPengecualian Metode atau operasi tidak diimplementasikan.
Pengecualian Tidak Didukung Metode atau operasi tidak didukung.
ObjectDisposedException Operasi dilakukan pada objek yang telah dibuang.
OverflowException Operasi aritmatika, casting, atau konversi menghasilkan overflow.
PathTooLongException Jalur atau nama file melebihi panjang maksimum yang ditentukan sistem.
PlatformNotSupportedException Operasi tidak didukung pada platform saat ini.
Pengecualian Peringkat Array dengan jumlah dimensi yang salah dilewatkan ke suatu metode.
Pengecualian Waktu Habis Interval waktu yang dialokasikan untuk operasi telah kedaluwarsa.
Pengecualian UriFormat Uniform Resource Identifier (URI) yang tidak valid digunakan.

Menerapkan pengecualian khusus

Dalam kasus berikut, menggunakan pengecualian .NET Framework yang ada untuk menangani kondisi kesalahan tidak memadai:

Saat pengecualian mencerminkan kesalahan program unik yang tidak dapat dipetakan ke pengecualian .NET Framework yang sudah ada.

Saat pengecualian memerlukan penanganan yang berbeda dari penanganan yang sesuai untuk pengecualian .NET Framework yang sudah ada, atau pengecualian harus disamarkan dari pengecualian serupa. Misalnya, jika Anda melempar pengecualian ArgumentOutOfRangeException saat mengurai representasi numerik dari string yang berada di luar jangkauan tipe integral target, Anda tidak ingin menggunakan pengecualian yang sama untuk kesalahan yang dihasilkan dari pemanggil yang tidak memberikan batasan yang sesuai nilai saat memanggil metode.

Kelas Pengecualian adalah kelas dasar dari semua pengecualian di .NET Framework. Banyak kelas turunan bergantung pada perilaku yang diwarisi dari anggota kelas Pengecualian, mereka tidak menimpa anggota Pengecualian, juga tidak mendefinisikan anggota unik.

Untuk mendefinisikan kelas pengecualian Anda sendiri:

Tentukan kelas yang mewarisi dari Pengecualian. Jika perlu, tentukan setiap anggota unik yang dibutuhkan oleh kelas Anda untuk memberikan informasi tambahan tentang pengecualian. Misalnya, kelas ArgumentException menyertakan properti ParamName yang menentukan nama parameter yang argumennya menyebabkan pengecualian, dan properti RegexMatchTimeoutException menyertakan properti MatchTimeout yang menunjukkan interval waktu habis.

Jika perlu, timpa anggota warisan yang fungsinya ingin Anda ubah atau ubah. Perhatikan bahwa sebagian besar kelas turunan yang ada dari Pengecualian tidak mengesampingkan perilaku anggota yang diwarisi.

Tentukan apakah objek pengecualian khusus Anda dapat diserialisasi. Serialisasi memungkinkan Anda untuk menyimpan informasi tentang pengecualian dan mengizinkan informasi pengecualian untuk dibagikan oleh server dan proxy klien dalam konteks jarak jauh. Untuk membuat objek pengecualian serializable, tandai dengan atribut SerializableAttribute.

Tentukan konstruktor kelas pengecualian Anda. Biasanya, kelas pengecualian memiliki satu atau lebih konstruktor berikut:

Exception(), yang menggunakan nilai default untuk menginisialisasi properti dari objek pengecualian baru.

Exception(String), yang menginisialisasi objek pengecualian baru dengan pesan kesalahan tertentu.

Pengecualian(String, Pengecualian), yang menginisialisasi objek pengecualian baru dengan pesan kesalahan tertentu dan pengecualian dalam.

Exception(SerializationInfo, StreamingContext), yang merupakan konstruktor terlindungi yang menginisialisasi objek pengecualian baru dari data serial. Anda harus mengimplementasikan konstruktor ini jika Anda telah memilih untuk membuat objek pengecualian Anda menjadi serial.

Contoh berikut mengilustrasikan penggunaan kelas pengecualian khusus. Ini mendefinisikan pengecualian NotPrimeException yang dilemparkan ketika klien mencoba untuk mengambil urutan bilangan prima dengan menentukan nomor awal yang bukan prima. Pengecualian mendefinisikan properti baru, NonPrime , yang mengembalikan nomor non-prima yang menyebabkan pengecualian. Selain mengimplementasikan konstruktor tanpa parameter yang dilindungi dan konstruktor dengan parameter SerializationInfo dan StreamingContext untuk serialisasi, kelas NotPrimeException mendefinisikan tiga konstruktor tambahan untuk mendukung properti NonPrime. Setiap konstruktor memanggil konstruktor kelas dasar selain mempertahankan nilai bilangan non-prima. Kelas NotPrimeException juga ditandai dengan atribut SerializableAttribute.

Kelas PrimeNumberGenerator yang ditunjukkan dalam contoh berikut menggunakan Saringan Eratosthenes untuk menghitung urutan bilangan prima dari 2 hingga batas yang ditentukan oleh klien dalam panggilan ke konstruktor kelasnya. Metode GetPrimesFrom mengembalikan semua bilangan prima yang lebih besar dari atau sama dengan batas bawah yang ditentukan, tetapi memberikan NotPrimeException jika batas bawah tersebut bukan bilangan prima.

Contoh berikut membuat dua panggilan ke metode GetPrimesFrom dengan nomor non-prima, salah satunya melintasi batas domain aplikasi. Dalam kedua kasus, pengecualian dilemparkan dan berhasil ditangani dalam kode klien.

Windows Runtime dan .NET Framework 4.5.1

Di aplikasi .NET untuk Windows 8.x Store untuk Windows 8, beberapa informasi pengecualian biasanya hilang saat pengecualian disebarkan melalui bingkai tumpukan non-.NET Framework. Dimulai dengan .NET Framework 4.5.1 dan Windows 8.1, runtime bahasa umum terus menggunakan objek Pengecualian asli yang dilemparkan kecuali pengecualian itu diubah dalam bingkai tumpukan non-.NET Framework.